D与S(牛客)


乍一看以为是博弈论,但仔细分析发现就是个简单的图论问题
个人觉得有点像五子棋
分析想要赢,就必须保证有两条以上的路径可供选择,并且这两条路都是必赢的
最简单必赢状态
一个点直接连接两条标记点
复杂点的必赢状态:
我们将最简单的必赢状态的那个点叫准必赢点
如果一个点直接连接了两个或以上的准必赢点,也是必赢状态
我开始用的dfs只能过70的点, 不知道哪错了

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e6+10;
int n,m,k;
int pd[maxn],vis[maxn];
vector<int>Q[maxn];
void dfs(int u){
	int cnt=0;
	for(int i=0;i<Q[u].size();i++){
		int to=Q[u][i];
		if(vis[to]==0)vis[to]=1,dfs(to);
		if(pd[to]==1)cnt++;
	}
	if(cnt>=2)pd[u]=1;
}
int main(){
	int T; 
	cin>>T;
	while(T--){
		cin>>n>>m>>k;
		memset(pd,0,sizeof(pd));
		memset(vis,0,sizeof(vis));
		for(int i=1,x;i<=k;i++)cin>>x,pd[x]=1;
		for(int i=1;i<=n;i++)Q[i].clear();
		for(int i=1;i<=m;i++){
			int a,b;cin>>a>>b;
			Q[a].push_back(b);
			Q[b].push_back(a); 
		}
		vis[1]=1;
		dfs(1);
		if(pd[1])cout<<"yes"<<endl;
		else cout<<"no"<<endl;
	}
     return 0;
}

bfs

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e6+5;
int n,m,k;
int pd[maxn],vis[maxn];
vector<int>Q[maxn];
stack<int>T;
void bfs(){
	while(!T.empty()){
		int u=T.top();
		T.pop();
		for(int i=0;i<Q[u].size();i++){
			int to=Q[u][i];
			if(vis[to])continue;
			pd[to]++;
			if(pd[to]>=2){
				vis[to]=1;
				T.push(to);
			}
		}
	}
}
int main(){
	int t; 
	cin>>t;
	while(t--){
		cin>>n>>m>>k;
		memset(pd,0,sizeof(pd));
		memset(vis,0,sizeof(vis));
		while(!T.empty())T.pop(); 
		for(int i=1,x;i<=k;i++)cin>>x,pd[x]=1,T.push(x),vis[x]=1;
		for(int i=1;i<=n;i++)Q[i].clear();
		for(int i=1;i<=m;i++){
			int a,b;cin>>a>>b;
			Q[a].push_back(b);
			Q[b].push_back(a); 
		}
		bfs();
		if(vis[1])cout<<"yes"<<endl;
		else cout<<"no"<<endl;
	}
     return 0;
}
原文地址:https://www.cnblogs.com/wzxbeliever/p/15677709.html