POJ2599 A funny game (圖博弈)
阿新 • • 發佈:2017-07-02
dfs track ems put std rep int layer 最小
題目鏈接:傳送門
題意:
給定一個圖,兩個人從起點出發,輪流開飛機。當離開這個點後這個點
就不能使用了。假設輪到誰了誰不能飛了就輸了。
必敗狀態非常好找,當一個人在位置s的時候與這個點相連的沒有點能用的
時候則必敗。
然後數據非常小。直接暴力搜索就能夠AC。
代碼例如以下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <set> #include <map> #include <queue> #define PB push_back #define MP make_pair #define REP(i,n) for(int i=0;i<(n);++i) #define FOR(i,l,h) for(int i=(l);i<=(h);++i) #define DWN(i,h,l) for(int i=(h);i>=(l);--i) #define IFOR(i,h,l,v) for(int i=(h);i<=(l);i+=(v)) #define CLR(vis) memset(vis,0,sizeof(vis)) #define MST(vis,pos) memset(vis,pos,sizeof(vis)) #define MAX3(a,b,c) max(a,max(b,c)) #define MAX4(a,b,c,d) max(max(a,b),max(c,d)) #define MIN3(a,b,c) min(a,min(b,c)) #define MIN4(a,b,c,d) min(min(a,b),min(c,d)) #define PI acos(-1.0) #define INF 1000000000 #define LINF 1000000000000000000LL #define eps 1e-8 #define LL long long using namespace std; const int maxn = 1001; int mp[maxn][maxn]; bool vis[maxn]; int ans,n,s; bool dfs(int id){ FOR(i,1,n){ if(mp[id][i]&&!vis[i]){//遍歷圖的順序確保了答案最小 vis[id]=1; if(!dfs(i)){ vis[id]=0; ans=i; return true; } } vis[id]=0; } return false; } int main(){ while(~scanf("%d%d",&n,&s)){ CLR(mp); REP(i,n-1){ int u,v; scanf("%d%d",&u,&v); mp[u][v]=1; mp[v][u]=1; } CLR(vis); if(dfs(s)) printf("First player wins flying to airport %d\n",ans); else puts("First player loses"); } return 0; }
POJ2599 A funny game (圖博弈)