树上的dp博弈,很easy的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define CLR(a) memset((a),0,sizeof((a)))
#define pb push_back
#define mp make_pair
#define ins insert
#define F first
#define S second
#define bug puts("Oh Here!");
#define nMax 2010
#define oo 0x7fffffff
#define eps 1e-8
#define LL long long
#define Vec vector<int>
#define Pai pair<int,int>
class Tree{
public:
int first[nMax],nxt[nMax],to[nMax],e;
int vis[nMax],n,win[nMax],place[nMax];
void init(){
memset(first,-1,sizeof(first));
memset(vis,0,sizeof(vis));
memset(place,-1,sizeof place );
e=0;
}
void addadge(int u,int v){
to[e]=v;nxt[e]=first[u];first[u]=e;e++;
to[e]=u;nxt[e]=first[v];first[v]=e;e++;
}
void dfs(int u){
win[u]=0;
vis[u]=1;
for(int i=first[u];i!=-1;i=nxt[i])if(!vis[to[i]]){
dfs(to[i]);
if(win[to[i]]==0) {
win[u]=1;
if(place[u]==-1 || place[u]>to[i]) place[u]=to[i];
}
}
return ;
}
};
void sovle(int n,int k){
Tree p;
p.n=n;
p.init();
for(int i=1,u,v;i<n;i++) {
scanf("%d%d",&u,&v);
p.addadge(u,v);
}
p.dfs(k);
if(p.win[k]){
printf("First player wins flying to airport %d\n",p.place[k]);
}else {
printf("First player loses\n");
}
}
int main(){
#ifndef ONLINE_JUDGE
// freopen("input.txt","r",stdin);
#endif
int n,k;
while(~scanf("%d%d",&n,&k)){
sovle(n,k);
}
return 0;
}