链接:http://codeforces.com/problemset/problem/915/D
题意:在一个有向图中,判断能不能至多删除一条边使得该图不含圈,n<=500, m<=100000
题解:枚举每一个点,让该点的入度减一,然后拓扑序判圈
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
vector<int> G[510];
int in[510];
int indu[510];
int n, m;
bool tuopu(){
queue<int> que;
for(int i = 1; i<=n; i++){
if(indu[i] == 0) que.push(i);
}
int cnt = 0;
while(que.size()){
int f = que.front();
que.pop();
cnt++;
for(int i = 0; i<G[f].size(); i++){
int v = G[f][i];
indu[v]--;
if(indu[v] == 0) que.push(v);
}
}
if(cnt == n) return true;
else return false;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 0; i<m; i++){
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
in[v]++;
}
for(int i = 1; i<=n; i++){
for(int j = 1; j<=n; j++) indu[j] = in[j];
indu[i]--;
if(tuopu() == true){
printf("YES\n");
return 0;
}
}
printf("NO\n");
return 0;
}