http://codeforces.com/contest/915/problem/D
判断是否能够通过删一条边使整个图无环
要判环,当然应该想到拓扑排序
由于本人昨天刚看过网络流的可行流 这道题用网络流搞了四个小时 最后认命网络流不可行
如果用拓扑排序
想想删边的意义是什么
在拓扑排序里面,每个点的意义只有入度和记录从这个点出发的边
而删边对点的影响只有入度--
so要模拟删边其实只需要模拟那条边的终点的入度--,而不需要具体到哪条边
#include <bits/stdc++.h>
#define MAXN 510
using namespace std;
vector <int > G[MAXN];
int ind[MAXN], cind[MAXN];
bool topo(int n){
queue <int > Q;
for(int i = 1; i <= n; i++){
cind[i] = ind[i];
if(ind[i] <= 0) Q.push(i);
}
int cnt = 0;
while(!Q.empty()){
int u = Q.front(); Q.pop();
cnt++;
for(int i = 0; i < G[u].size(); i++){
int v = G[u][i];
cind[v]--;
if(cind[v] == 0) Q.push(v);
}
}
return cnt == n;
}
int main(){
int n, m, u, v;
scanf("%d%d", &n, &m);
while(m--){
scanf("%d%d", &u, &v);
G[u].push_back(v);
ind[v]++;
}
for(int i = 1; i <= n; i++){
ind[i]--;//模拟删边,不用具体到哪条边
if(topo(n)) {printf("YES"); return 0;}
ind[i]++;
}
printf("NO");
return 0;
}