题意:给定无向图,两个人依次决定移动位置,若一方无路可走则为输,判断先行者的输赢及赢时第一步的走向(若多路皆可,输出较小的数,注意排序)走过的位置会自动销毁,即记忆化搜索。
思路:DFS记忆化搜索,对访问点排序,bool DFS(int k,bool who,node vis)中k表示要访问的位置编号,who为1表示先行者,0表示次行者,vis记录访问。返回true,先行者赢。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,K;
vector<int> s[1001];
struct node{
bool visit[1002];
}vis;
bool dfs(int k,int who,struct node vis){
if(vis.visit[k]==true&&who==0) return true;
else if(vis.visit[k]==true&&who==1) return false;
vis.visit[k]=true;
if(s[k].size()==0&&who==1) return true;
else if(s[k].size()==0&&who==0) return false;
for(int j=0;j<s[k].size();j++){
if(who==0){
if(dfs(s[k][j],1,vis)==true) return true;
}
else if(who==1){
if(dfs(s[k][j],0,vis)==false) return false;
}
}
if(who==0) return false;
else return true;
}
int main(){
while(scanf("%d%d",&N,&K)!=EOF){
int a,b;
for(int i=0;i<N-1;i++){
scanf("%d%d",&a,&b);
s[a].push_back(b);
s[b].push_back(a);
}
int land=1122;
for(int i=0;i<1002;i++) vis.visit[i]=false;
vis.visit[K]=true;
sort(s[K].begin(),s[K].end());
for(int j=0;j<s[K].size();j++){
if(dfs(s[K][j],1,vis)==true ){
land=s[K][j];
break;
}
}
if(land==1122) printf("First player loses\n");
else printf("First player wins flying to airport %d\n",land);
for(int i=0;i<1001;i++) s[i].clear();
}
return 0;
}
/*测试:
Sample Input
4 3
3 2
3 1
1 4
Sample Output
First player wins flying to airport 2
*/