题解 | #【模板】拓扑排序#

【模板】拓扑排序

https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c

//拓扑排序模板
#include <bits/stdc++.h>
using namespace std;
#define MAX 200001

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> adjlist[MAX]; // 邻接链表vector容器
    int inDegree[MAX] = {0};  // 记录入度数组
    int a, b;
    for(int i = 0; i < m; i++)
    {
        cin >> a >> b;
        adjlist[a].push_back(b);
        inDegree[b]++;
    }

    queue<int> que;
    for(int i = 1; i <= n; i++)
    {
        if(inDegree[i] == 0)
        que.push(i);
    }
    int cnt = 0; // 判断是否存在环
    vector<int> res; // 用于存储结果
    while(!que.empty())
    {
        int u = que.front();
        que.pop();
        res.push_back(u);
        for(int i = 0; i < adjlist[u].size(); i++)
        {
            int v = adjlist[u][i];
            inDegree[v]--;
            if(inDegree[v] == 0)
            que.push(v);
        }
        cnt++;
    }
    if(cnt == n){
        for(int i = 0; i < res.size(); i++)
        {
            cout << res[i];
            if(i != res.size() - 1)cout << " ";
        }
    }
    else {
    cout << -1;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务