D - Sleepy Game

版权声明:https://github.com/godspeedcurry 欢迎加好友哦 https://blog.csdn.net/qq_38677814/article/details/82893789

题目很简单
乍一看博弈 其实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;
}

猜你喜欢

转载自blog.csdn.net/qq_38677814/article/details/82893789