巧妙的拓扑排序 Educational Codeforces Round 36 D

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;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值