zoukankan      html  css  js  c++  java
  • 【Educational Codeforces Round 36 D】 Almost Acyclic Graph

    【链接】 我是链接,点我呀:)
    【题意】

    在这里输入题意

    【题解】

    找到任意一个环。 然后枚举删掉其中的某一条边即可。 (因为肯定要删掉这个环的,那么方法自然就是删掉其中的某一条边 (其它环,如果都包括这条边,那么就可以,否则,某个环不包括那也没办法,自然就无解了。 这样枚举的边的数目最多是500(环最多N条边) 然后复杂度就是500*10万了。 足够过了

    【代码】

    /*
      	1.Shoud it use long long ?
      	2.Have you ever test several sample(at least therr) yourself?
      	3.Can you promise that the solution is right? At least,the main ideal
      	4.use the puts("") or putchar() or printf and such things?
      	5.init the used array or any value?
      	6.use error MAX_VALUE?
      	7.use scanf instead of cin/cout?
      	8.whatch out the detail input require
    */
    /*
        一定在这里写完思路再敲代码!!!
    */
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 5e2;
    
    int n,m;
    vector <int> g[N+10],path;
    int bo[N+10];
    
    bool dfs1(int x){
    	bo[x] = 1;
    	for (int y:g[x]){
    		if (bo[y]==0 && dfs1(y)){
    			path.push_back(x);
    			return true;
    		}
    		else
    			if (bo[y]==1) {
    				path.push_back(y);
    				path.push_back(x);
    				return true;
    			}
    	}
    	bo[x] = 2;
    	return false;
    }
    
    bool dfs2(int x,int a,int b){
    	bo[x] = 1;
    	for (int y:g[x]){
            if (x==a && y==b) continue;
    		if (bo[y]==0 && dfs2(y,a,b)) return true;
    		else
    			if (bo[y]==1) return true;
    	}
    	bo[x] = 2;
    	return false;
    }
    
    int main(){
    	#ifdef LOCAL_DEFINE
    	    freopen("rush_in.txt", "r", stdin);
    	#endif
    	ios::sync_with_stdio(0),cin.tie(0);
    	cin >> n >> m;
    	for (int i = 1;i <= m;i++){
    		int x,y;
    		cin >> x >> y;
    		g[x].push_back(y);
    	}
    
    	bool loop1 = false;
    
    	for (int i = 1;i <= n;i++)
    		if (bo[i]==0 && dfs1(i)){
    			loop1 = true;
    			break;
    		}
    
    	if (!loop1) return cout<<"YES"<<endl,0;
    
    	reverse(path.begin(),path.end());
    
    	for (int i = 0;i <(int) path.size()-1;i++){
    		int x = path[i],y = path[i+1];
            loop1 = false;
            memset(bo,0,sizeof bo);
            for (int j = 1;j <= n;j++)
                if (bo[j]==0 && dfs2(j,x,y)){
                    loop1 = true;
                    break;
                }
            if (!loop1) return cout <<"YES"<<endl,0;
    	}
        cout <<"NO"<<endl;
    	return 0;
    }
    
    
  • 相关阅读:
    纯CSS打造可折叠树状菜单
    c++ Constructor FAQ 继续
    Java设计模式偷跑系列(六)Singleton模式的建模与实现
    优秀的产品经理是怎样炼成的?
    Pki原则
    屌丝男初中丰富的工作实践反击
    Android Material Design带UI变化
    unity多边形uv地图
    BZOJ 1208 HNOI2004 宠物收容所 平衡树/set
    [连载]Java程序设计(04)---任务驱动的方法:工资结算系统
  • 原文地址:https://www.cnblogs.com/AWCXV/p/8282387.html
Copyright © 2011-2022 走看看