hdu6105 Gameia 思维

来源:互联网 发布:淘宝详情页图片上传 编辑:程序博客网 时间:2024/05/18 20:12

http://acm.hdu.edu.cn/showproblem.php?pid=6105

只要存在一个不等于2的连通块,Bob就会输,所以Bob只能尽量的全切成大小都为2的连通块,如果切不成则输

#include<bits/stdc++.h>using namespace std;int flog,n,k,num[505];vector<int>w[505];void dfs(int x){    if(!flog)        return ;    int now=0;    for(int i=0;i<w[x].size();i++)    {        dfs(w[x][i]);        if(num[w[x][i]]>=2)        {            flog=0;            return ;        }        now+=num[w[x][i]];    }    if(now==1)    {        if(k)        k--,num[x]=0;//切掉        else        num[x]=2;    }    else if(now==0)        num[x]=1;//切完后的留下的叶子节点    else        flog=0;//有多个子节点    return ;}int main(){    int T,i,f;    cin>>T;    while(T--)    {        cin>>n>>k;        flog=1;        for(i=2;i<=n;i++)        {            scanf("%d",&f);            w[f].push_back(i);        }        dfs(1);        if(num[1]==1||num[1]>2)            flog=0;        if(flog)            cout<<"Bob"<<endl;        else            cout<<"Alice"<<endl;        for(i=0;i<=n;i++)            w[i].clear();    }    return 0;}