Almost Acyclic Graph CodeForces - 915D (思维,图论)

大意: 给定无向图, 求是否能删除一条边后使图无环

直接枚举边判环复杂度过大, 实际上删除一条边可以看做将该边从一个顶点上拿开, 直接枚举顶点即可

复杂度$O(n(n+m))$

#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <cstdio>
#include <queue>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define pb push_back
using namespace std;

const int N = 510;
int n, m, ok;
vector<int> g[N];
int vis[N], s[N], deg[N], a[N];


int topo() {
	queue<int> q;
	REP(i,1,n) if (!a[i]) q.push(i);
	int r = 0;
	while (!q.empty()) {
		++r;
		int x=q.front();q.pop();
		for (int y:g[x]) {
			if (!--a[y]) q.push(y);
		}
	}
	return r==n;
}

int main() {
	scanf("%d%d", &n, &m);                                                      
	REP(i,1,m) {
		int u, v;
		scanf("%d%d", &u, &v);
		g[u].pb(v),++deg[v];
	} 
	REP(i,1,n) if (deg[i]) {
		memcpy(a,deg,sizeof deg);
		--a[i];
		if (topo()) return puts("YES"),0;
	}
	puts("NO");
}

猜你喜欢

转载自www.cnblogs.com/uid001/p/10346674.html