hdu 3197

来源:互联网 发布:移动4g数据卡 编辑:程序博客网 时间:2024/04/28 05:52

hdu 3197
题意:
给一棵树,两个人每次砍树干,最后没得砍的那个人输,试着判断谁输谁赢。

TIP:
输入很坑,-1代表该点就在地上。
思路:
树形博弈,递归求解sg值即可。NIM博弈。
代码:

#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<queue>#include<map>#include<stack>#include<algorithm>using namespace std;int n;vector<int >ve[1007],s;int res=0;int dfs(int now,int pre){    int res=0;    for(int i=0;i<ve[now].size();i++)    {     int t=ve[now][i];     if(t!=pre)        res=res^(1+dfs(t,now));    }    return res;}int main(){    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<=n;i++)            ve[i].clear();        s.clear();        for(int i=0;i<n;i++)        {            int x;            scanf("%d",&x);            if(x==-1)            {                s.push_back(i);            }            else                {                    ve[x].push_back(i);                    ve[i].push_back(x);                }        }        res=0;        for(int i=0;i<s.size();i++)        {            res=res^dfs(s[i],-1);        }        if(res==0)        {            puts("NO");        }        else            puts("YES");    }    return 0;}
0 0
原创粉丝点击