题目
分析
- 用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
");
53 else printf("Bob
");
54 }
55 }