Sleepy Game
阿新 • • 發佈:2018-12-12
題目很簡單 乍一看博弈 其實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;
}