您的位置:首页 > 其它

HDU 6105 Gameia [想法题]

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

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

AC代码:

#include<stdio.h>
#include<vector>
using namespace std;
vector<int>vt[505];
int size[505];
int flag=0;
void dfs(int u)
{
int num=0;
size[u]=1;
for(int i=0;i<vt[u].size();i++)
{
int to=vt[u][i];
dfs(to);
size[u]+=size[to];
if(size[to]%2==1)num++;
}
if(num>=2)flag=1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
for(int i=0;i<505;i++)vt[i].clear();
int n,k;
scanf("%d%d",&n,&k);
for(int i=2;i<=n;i++)
{
int f;
scanf("%d",&f);
vt[f].push_back(i);
}
flag=0;
dfs(1);
if(flag==1||n%2==1)printf("Alice\n");
else if(n/2-1>k)printf("Alice\n");
else printf("Bob\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: