思路:
在贾志豪神牛的论文 里,这两种游戏都有
其中树的删边游戏:叶子节点的SG值为0;中间节点的SG值为它的所有子节点的SG值加1 后的异或和。
ANTI-SG:先手必胜当且仅当:(1)游戏的SG函数不为0且游戏中某个单一游戏的SG函数大于1;(2)游戏的SG函数为0且游戏中没有单一游戏的SG函数大于1。
代码如下:
#include<cstdio>
#include<vector>
using namespace std;
vector<int>p[];
int ans,n;
int dfs(int m,int f)
{
int res=;
for(int i=;i<p[m].size();i++){
if(p[m][i]!=f){
res^=(+dfs(p[m][i],m));
}
}
return res;
}
int main()
{
int t,u,v,cnt,s;
while(scanf("%d",&t)!=EOF){
cnt=ans=;
while(t--){
scanf("%d",&n);
for(int i=;i<=n;i++) p[i].clear();
for(int i=;i<n-;i++){
scanf("%d%d",&u,&v);
p[u].push_back(v);
p[v].push_back(u);
}
s=dfs(,-);
if(s>) cnt++;
ans^=s;
}
if(ans) puts(cnt>=?"PP":"QQ");
else puts(cnt?"QQ":"PP");
}
}