soj 2013年 Nanjing Slection

这样加边比STL快!

不明白为什么要+mod

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<vector>
 6 #include<algorithm>
 7 #define INF 0x3f3f3f3f
 8 #define M(a,b) memset(a,b,sizeof(a))
 9 typedef long long LL;
10 using namespace std;
11 
12 const LL mod = 1000000007;
13 int N,M;
14 int dp[5060][5060];
15 int tot[5060];
16 
17 
18 struct node
19  {
20      int t,nxt;
21  }edge[5060*2];
22 int headline[5060];
23 int E;
24 void add(int f,int t)
25  {
26      E++;
27      edge[E].t = t;
28      edge[E].nxt = headline[f];
29      headline[f] = E;
30  }
31 
32 void dfs(int u, int fa)
33 {
34     for(int i = headline[u];i != -1;i = edge[i].nxt)
35     {
36         int t = edge[i].t;;
37         if(t!=fa)
38         {
39             dfs(t,u);
40             for(int j = 1;j<=M;j++)
41             {
42                 if(tot[t]-dp[t][j]<0)
43                 dp[u][j] = ((LL)dp[u][j]*(tot[t]-dp[t][j]+mod)%mod)%mod;
44                 else
45                 dp[u][j] = ((LL)dp[u][j]*(tot[t]-dp[t][j])%mod)%mod;
46             }
47         }
48     }
49     for(int i = 1;i<=M;i++)
50     {
51         tot[u] = (tot[u]+dp[u][i])%mod;
52     }
53     return;
54 }
55 
56 int main()
57 {
58     while(scanf("%d%d",&N,&M)==2)
59     {
60         int t;
61         M(dp,0);
62         M(headline,-1);
63         M(tot,0);
64         E=0;
65         for(int i = 1;i<=N;i++)
66         {
67             scanf("%d",&t);
68             int a;
69             for(int j = 0;j<t;j++) {scanf("%d",&a);dp[i][a]=1;}
70         }
71         int u,v;
72         for(int i = 0;i<N-1;i++)
73            {
74              scanf("%d%d",&u,&v);
75              add(u,v);
76              add(v,u);
77            }
78         dfs(1,0);
79         printf("%d\n",tot[1]%mod);
80     }
81     return 0;
82 }

 

posted @ 2014-10-19 19:25  haohaooo  阅读(99)  评论(0编辑  收藏  举报