Educational Codeforces Round 36 (Rated for Div. 2) D. Almost Acyclic Graph

版权声明:希望能帮到弱校的ACMer成长,因为自己是弱校菜鸡~~~~ https://blog.csdn.net/Mr__Charles/article/details/82390892

                               D. Almost Acyclic Graph


题解:

    大致题意就是给你个有向图,问你能否最多去除一条边的情况下,形成有向无环图。

    还是一个穿背心的裸题。

    因为m最大才1e5,所以可以这样,如果第一次进行拓扑排序不是DAG,

    那么,就遍历所有入度大于等于1的点进行删边,然后再进行拓扑排序。(因为如果存在环,那么环内的每个点度数必定大于等于1)

 

代码:

#include<cstdio>
#include<iostream>
#include<algorithm> 
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int MAXN = 1e5+5;
int n,m;
int indeg[505],indegree[505];
vector<int> edge[MAXN];
queue<int> q;

void init(){
	for(int i = 1; i <= n; ++i){
		edge[i].clear();
		indeg[i] = 0;
	}
	while(!q.empty()) q.pop();
}

bool topsort(){
	int cnt = 0;
	for(int i = 1; i <= n; ++i)
	    if(!indeg[i])
	        q.push(i);
	while(!q.empty()){
		int now = q.front();
		cnt++;
		q.pop();
		for(int i = 0; i < edge[now].size();++i)
		    if(--indeg[edge[now][i]] == 0)
		        q.push(edge[now][i]);
	}
	if(cnt == n) return true;
	return false;
}

int main(){
	int u,v;
	while(~scanf("%d%d",&n,&m)){
		init();
		for(int i = 1; i <= m ;++i){
			scanf("%d%d",&u,&v);
			edge[u].push_back(v);
			indeg[v]++;
			indegree[v]++;
		}
		if(topsort()) puts("YES");
		else{
			bool flag = false;
			for(int i = 1; i <= n; ++i){
				memcpy(indeg,indegree,sizeof(indegree));
				if(indeg[i] >= 1){
					--indeg[i];
					if(topsort()){
						flag = true;
						break;
					}
				}
			}
			if(flag) puts("YES");
			else puts("NO");
		}
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/Mr__Charles/article/details/82390892