codeforces 915D

枚举每个点的入度-1,无须考虑删除的是哪一条边,然后拓扑排序。若每个点都能遍历到则YES,否则NO

#include"bits/stdc++.h"
using namespace std;
const int MAXN = 555;
int du[MAXN],ru[MAXN];
bool vis[MAXN];
vector <int> G[MAXN];
int n,m;
bool check(int x)
{
    queue<int> que;
    fill(vis+1,vis+1+n,0);
    for(int j = 1; j <= n; j++)
        du[j] = ru[j];
    du[x]--;
    for(int i = 1; i <= n; i++)
    if(du[i] == 0){
        que.push(i);
        vis[i] = 1;
    }

    while(que.size()){
        int u = que.front(); que.pop();
        for(int i = 0; i < G[u].size(); i++){
            int v = G[u][i];
            du[v]--;
            if(du[v] <= 0 && !vis[v]){
                que.push(v);
                vis[v] = 1;
            }
        }
    }
    bool flag = 1;
    for(int i = 1; i <= n; i++)
        if(!vis[i]) flag = 0;
    return flag;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= m; i++){
        int u,v;
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
        ru[v]++;
    }

    bool flag = check(0);
    if(!flag) for(int i = 1; i <= n; i++)
    if(ru[i]){
        flag = check(i);
        if(flag) break;
    }
    if(flag) puts("YES");
    else puts("NO");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值