1. 程式人生 > >Sleepy Game

Sleepy Game

題目很簡單 乍一看博弈 其實DFS就夠啦 但這個DFS比較麻煩 1.初步思路 2次dfs 判win+判環 分開判斷 2.1次DFS搞定所有 坑點:你可以訪問一個點幾次來實現WIN! 所以不能判斷有環就停止visit了 這樣題目就明晰了 我們可以記錄每個點是否在棧中來判斷環 給每個點多個訪問機會來實現重複走 題目得解 那麼訪問幾次呢 2次 or more? 顯然2次就夠了 對應兩個狀態 奇數到達和偶數到達

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
vector<int> v[102000];
vector<int> path; int vis[102000][2]; int st[102000]; bool circle=false; void dfs(int x,int dep){ if(vis[x][dep&1]) return;//狀態出現 返回 vis[x][dep&1]=1; if(v[x].size()==0&&(dep&1)){ printf("Win\n"); for(int i=0;i<path.size();++i){ printf("%d%c",path[i],i==path.size()-1?'\n'
:' '); } exit(0); } for(int i=0;i<v[x].size();++i){ int to=v[x][i]; if(st[to]) circle=true; path.pb(to); st[to]=true; dfs(to,dep+1); path.pop_back(); st[to]=false; } } int main(){ int n,m; ios::sync_with_stdio(0); cin.tie(0); cin>>n>>m; for(int i=1;i<=n;++i)
{ int num;cin>>num; for(int j=1;j<=num;++j){ int to; cin>>to; v[i].pb(to); } } int s; cin>>s; st[s]=true; path.pb(s); dfs(s,0); if(circle){ printf("Draw\n"); } else{ printf("Lose\n"); } return 0; }