POJ 2599 A funny game [DFS博弈]

来源:互联网 发布:淘宝客服需要做什么 编辑:程序博客网 时间:2024/05/21 11:01

 题意:给定无向图,两个人依次决定移动位置,若一方无路可走则为输,判断先行者的输赢及赢时第一步的走向(若多路皆可,输出较小的数,注意排序)走过的位置会自动销毁,即记忆化搜索。

思路: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 Input4 33 2 3 11 4Sample OutputFirst player wins flying to airport 2*/