题目: 给定一棵有N个节点双向边的树,从某个节点出发,两人轮流不重复地转移到另一个节点,无路可走的人输。
分析:树形博弈, N态的后继一定有P态,P态没有N后继态。 注意状态的转移。。。。。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1010;
int M[maxn][maxn],vis[maxn],L,N,K;
bool Win(int p){
vis[p]=1;
for(int i=1;i<=N;i++)if(M[p][i]){
if(!vis[i]){
if(!Win(i)){
vis[p]=0;
L=i;
return true;
}
}
}
vis[p]=0;
return 0;
}
int main(){
//freopen("D:/程序/ACM/C-Free/in.txt","r",stdin); freopen("D:/程序/ACM/C-Free/out.txt","w",stdout);
while(~scanf("%d%d",&N,&K)){
memset(M,0,sizeof(M)); memset(vis,0,sizeof(vis));
int x,y;
for(int i=1;i<N;i++){
scanf("%d%d",&x,&y);
M[x][y]=M[y][x]=1;
}
if(Win(K)) printf("First player wins flying to airport %d\n",L);
else printf("First player loses\n");
}
return 0;
}