链接: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; }