拓扑排序 Problem C: Legal or Not

>>>>>>题目地址<<<<<<

  • 思路:拓扑排序, 注意点:每次要更新inD
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
vector<int> G[maxn];
int inD[maxn];

void TopologicalSort(int n)
{
    queue<int> q;
    for(int i = 0; i < n; ++i)
    {
        if(inD[i] == 0)
        {
            q.push(i);
        }
    }
    int num = 0;
    while(!q.empty())
    {
        int now = q.front();
        q.pop();
        num++;
        for(int i = 0; i < G[now].size(); ++i)
        {
            int nex = G[now][i];
            inD[nex]--;
            if(inD[nex] == 0)
            {
                q.push(nex);
            }
        }
    }
    printf("%s\n", num == n ? "YES" : "NO");
}
int main()
{
    int n, m;
    while(scanf("%d %d", &n, &m) != EOF && n != 0)
    {
        for(int i = 0; i < m; ++i)
        {
            int p1, p2;
            scanf("%d %d", &p1, &p2);
            G[p1].push_back(p2);
            inD[p2]++;
        }
        TopologicalSort(n);
        for(int i = 0; i < n; ++i) G[i].clear();
        memset(inD, 0, sizeof(inD));
    }
}

发布了316 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42347617/article/details/104866039