hdu6105(想法题)

来源:互联网 发布:dt大数据 编辑:程序博客网 时间:2024/05/16 08:32

题意:Alice和Bob玩一个游戏,开始有一颗没有颜色的树,Bob和Alice分别对树进行染色,Alice每次将一个没有颜色的点涂成白色,Bob每次将一个没有颜色的点涂成黑色,并且可以将与涂上黑色的点直接相邻的点变为黑色,假如最后树上存在白色点,Alice赢,否则Bob赢。Bob还有一个特权,可以在任意时候,删除任意一条边。

题解:通过推论发现,当树为奇数点数时,Alice必应,偶数的时候,假如Bob能将树划分为所有都是只有两个点相连的话,Bob赢。

AC代码:

[cpp] view plain copy
print?
  1. #include<stdio.h>  
  2. #include<vector>  
  3. using namespace std;  
  4. vector<int>vt[505];  
  5. int size[505];  
  6. int flag=0;  
  7. void dfs(int u)  
  8. {  
  9.     int num=0;  
  10.     size[u]=1;  
  11.     for(int i=0;i<vt[u].size();i++)  
  12.     {  
  13.         int to=vt[u][i];  
  14.         dfs(to);  
  15.         size[u]+=size[to];  
  16.         if(size[to]%2==1)num++;  
  17.     }  
  18.     if(num>=2)flag=1;  
  19. }  
  20. int main()  
  21. {  
  22.     int T;  
  23.     scanf("%d",&T);  
  24.     while(T--)  
  25.     {  
  26.         for(int i=0;i<505;i++)vt[i].clear();  
  27.         int n,k;  
  28.         scanf("%d%d",&n,&k);  
  29.         for(int i=2;i<=n;i++)  
  30.         {  
  31.             int f;  
  32.             scanf("%d",&f);  
  33.             vt[f].push_back(i);  
  34.         }  
  35.         flag=0;  
  36.         dfs(1);  
  37.         if(flag==1||n%2==1)printf("Alice\n");  
  38.         else if(n/2-1>k)printf("Alice\n");  
  39.         else printf("Bob\n");  
  40.     }  
  41. }  


原创粉丝点击