JZOJ 1350. 游戏
题目
分析
- 用DFS先把树的深度跑一遍
- 然后因为每次只能搞一颗
- 每个点深度乘上个数得到两个人的值
- 比较大小即可
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #define N 10005 6 using namespace std; 7 8 int p,q; 9 int i,j,n,m1,m2,l,u,v,ans_A,ans_B; 10 int s1[N],s2[N],d[N]; 11 bool vis[N]; 12 13 int next[N*2],list[N],to[N*2]; 14 15 void add(int x) { 16 next[++l]=list[x]; 17 list[x]=l; 18 } 19 20 void dfs(int x) { 21 for (int t=list[x],y=to[t];t;t=next[t],y=to[t]) { 22 if (!vis[y]) { 23 vis[y]=true; d[y]=d[x]+1; dfs(y); 24 } 25 } 26 } 27 28 int main() 29 { 30 scanf("%d",&p); 31 for (q=1;q<=p;q++) { 32 scanf("%d%d%d",&n,&m1,&m2); 33 l=0; 34 memset(list,0,sizeof(list)); 35 for (i=1;i<=n-1;i++) { 36 scanf("%d%d",&u,&v); 37 to[i*2-1]=v; add(u); 38 to[i*2]=u; add(v); 39 } 40 for (i=1;i<=m1;i++) 41 scanf("%d",&s1[i]); 42 for (i=1;i<=m2;i++) 43 scanf("%d",&s2[i]); 44 memset(vis,false,sizeof(vis)); 45 vis[0]=true; 46 dfs(0); 47 ans_A=ans_B=0; 48 for (i=1;i<=m1;i++) 49 ans_A+=d[s1[i]]; 50 for (i=1;i<=m2;i++) 51 ans_B+=d[s2[i]]; 52 if (ans_A>ans_B) printf("Alice\n"); 53 else printf("Bob\n"); 54 } 55 }
为何要逼自己长大,去闯不该闯的荒唐