给一个无向图,n个点,n-1条边,两个人博弈,棋子从k点出发,每人走一步不能往回走,最后没的走的输。输出第一个人能赢的情况下走的最小点。
dfs搜出答案。只要有一个能赢就能赢,具体看代码
AC代码:
#include<stdio.h> #include<string.h> #define N 1010 struct pro { int v,next; } edge[N*3]; int head[N],mark[N],min; int e,k; void init() { memset(head,-1,sizeof(head)); memset(mark,0,sizeof(mark)); e=0;min=N; } void addedge(int u,int v) { edge[e].v=v;edge[e].next=head[u];head[u]=e++; edge[e].v=u;edge[e].next=head[v];head[v]=e++; } int dfs(int u)//现在要走的人输赢 { int i,v; for (i=head[u];i!=-1;i=edge[i].next) { v=edge[i].v;//有一个点可赢即可 if (!mark[v]) { mark[v]=1; if (!dfs(v))//判断走v,另外一个人输赢; { if (u!=k) { mark[v]=0; return 1;//返回,选择到达v的那个人走v不能赢 } if (min>v) min=v;//最后递归回来,如果走v另外一个人没的走即第一个人可赢,判断大小 } mark[v]=0; } } return 0; } int main () { int n,u,v,ans; int i,j; while (scanf("%d%d",&n,&k)!=EOF) { init(); for (i=1;i<n;++i) { scanf("%d%d",&u,&v); addedge(u,v); } mark[k]=1; dfs(k); if (min!=N) printf("First player wins flying to airport %d\n",min); else printf("First player loses\n"); } return 0; }