HDU6105 Gameia(博弈+图)

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
/*
博弈+图
给定一个树,对空节点进行染色,数有n个节点,根为1
Bob有k次删边的机会,
Bob选择一个空节点染色(黑色),他的儿子节点也会被染黑
Alice可以任选一个空节点染色(白色) 
如果有白色点则Alice赢,否则Bob赢。

*/
const int maxn=500+10;

vector<int>G[maxn];
int n,k;
int flag;

//出现某个结点有>=2个子节点为叶子节点。Alice染这个点,
//Bob跟不上Alice的节奏,出现孤点,Ailice取胜
int dfs(int u)
{
    int cnt=0;
    for(int i=0;i<G[u].size();i++)
    {
        cnt+=dfs(G[u][i]);
        if(cnt>=2) flag=0;
    }
    if(G[u].size()==0) return 1;//叶子节点
    return 0;
}
int main()
{
   int t;
   scanf("%d",&t);
   while(t--)
   {
       scanf("%d %d",&n,&k);

       for(int i=1;i<=n;i++)
       {
           G[i].clear();
       }
       int u;
       flag=1;
       for(int i=2;i<=n;i++)
       {
           scanf("%d",&u);
           G[u].push_back(i);
       }
       if(n==2)//只有两个空节点
       {
           printf("Bob\n");
           continue;
       }
       if(n&1)//奇数个节点,原树不存在两两匹配的方案
       {
           printf("Alice\n");
           continue;
       }
       if(k<n/2-1)//原树存在两两匹配的方案,而Bob的小动作不足以把树分成两两的点对
       {
           printf("Alice\n");
           continue;
       }
       dfs(1);
       if(flag)
       {
           printf("Bob\n");
       }
       else//出现某个结点有>=2个子节点为叶子节点
       {
           printf("Alice\n");
       }
   }
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值