首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。