题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3590;
题目分析:本题是一个基本的树的删边游戏,还是很简单的,首先,每个叶子结点的sg值为0,中间节点的sg值是子节点的sg值+1的亦或值,最后把几个树的根节点的sg亦或就好了,但不要忘记本题是ANTI-NIM,判断方式与正常的NIM不一样
代码如下:
#include <vector> #include <math.h> #include <stdio.h> #include <string.h> #include <iostream> using namespace std; vector<int>G[105]; bool vis[1005]; int get_sg(int u){ int cnt=0; vis[u]=true; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(vis[v]==true)continue; cnt^=(get_sg(v)+1); } return cnt; } //求sg值 int main(){ int n; while(scanf("%d",&n)!=EOF){ int x=0; int m; int le,re; int sum=0; for(int i=0;i<n;i++){ scanf("%d",&m); for(int i=0;i<100;i++) G[i].clear(); memset(vis,false,sizeof(vis)); for(int j=0;j<m-1;j++){ scanf("%d%d",&le,&re); G[le].push_back(re); G[re].push_back(le); } int s=get_sg(1); x^=s; if(s>1)sum++; } if((x&&sum)||((!x)&&(!sum)))puts("PP"); else puts("QQ"); //ANTI-SG的判断方式 } return 0; }