zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java中使用MD5加密的算法
    [转]自定义注释@interface的用法
    [转]Spring IOC详解
    [转]sed命令详解
    SimpleDateFormat线程不安全问题处理
    Unable to locate the Javac Compiler 解决办法
    MySQL ERROR 1045错误解决办法
    Python装饰器学习(九步入门)
    python 可变参数函数定义* args和**kwargs的用法
    如何更好的利用Node.js的性能极限
  • 原文地址:https://www.cnblogs.com/wzxbeliever/p/15677709.html
Copyright © 2011-2022 走看看