首页 > 代码库 > UVA 11174 Stand in a Line 树形dp+计数
UVA 11174 Stand in a Line 树形dp+计数
题意:白书的P103.
加个虚根就可以了。。。然后就是一个多重集排列。
[java] view plaincopy
- import java.io.PrintWriter;
- import java.util.ArrayList;
- import java.util.Scanner;
- public class Main {
- static int N = 40100;
- ArrayList<Integer>[] G = new ArrayList[N];
- static long mod = 1000000007;
- long[] way = new long[N];
- long[] fac = new long[N];
- int n, m;
- int[] father = new int[N], siz = new int[N];
- long Pow(long x, long y){
- long ans = 1;
- while(y > 0){
- if(y%2 == 1L)
- ans = (ans*x)%mod;
- x = (x*x)%mod;
- y >>= 1;
- }
- return ans;
- }
- void dfs(int u, int fa){
- siz[u] = 1; way[u] = 1L;
- for(int i = 0; i < G[u].size(); i++){
- int v = G[u].get(i); if(v == fa)continue;
- dfs(v, u);
- siz[u] += siz[v];
- way[u] = (way[u]*way[v])%mod;
- }
- way[u] = (way[u]* fac[siz[u]-1]) %mod;
- for(int i = 0; i < G[u].size(); i++){
- int v = G[u].get(i); if(v == fa)continue;
- way[u] = (way[u] * Pow(fac[siz[v]], mod-2))%mod;
- }
- }
- void init(){
- n = cin.nextInt(); m = cin.nextInt();
- for(int i = 0; i <= n; i++){
- father[i] = 0;
- G[i].clear();
- }
- while(m-- > 0){
- int u = cin.nextInt(), v = cin.nextInt();
- G[v].add(u);
- father[u] = v;
- }
- for(int i = 1; i <= n; i++)
- if(father[i] == 0){
- G[0].add(i);
- }
- }
- void work() {
- for(int i = 0; i < N; i++)G[i] = new ArrayList();
- fac[0] = 1L;
- for(int i = 1; i < N; i++) fac[i] = fac[i-1]*i%mod;
- int T = cin.nextInt();
- while(T-->0){
- init();
- dfs(0,0);
- out.println(way[0]);
- }
- }
- Main() {
- cin = new Scanner(System.in);
- out = new PrintWriter(System.out);
- }
- public static void main(String[] args) {
- Main e = new Main();
- e.work();
- out.close();
- }
- public Scanner cin;
- public static PrintWriter out;
- }
UVA 11174 Stand in a Line 树形dp+计数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。