首页 > 代码库 > soj 2013年 Nanjing Slection

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 node19  {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                 else45                 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 }

 

soj 2013年 Nanjing Slection