codeforces-915D Almost Acyclic Graph(拓扑序判圈)

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

猜你喜欢

转载自blog.csdn.net/grimcake/article/details/79829124
今日推荐