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

【模板】拓扑排序

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

初学图,配合章老师的【7.8 拓扑排序之算法实现】https://www.bilibili.com/video/BV1Qb4y1h7HY?vd_source=a6f22bf63a765351b788dbc276780f95视频完成练习

#include <bits/stdc++.h>
#include <queue>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    // 入度容器
    vector<int> in(n + 1, 0);
    // 有向无环图邻接表
    vector<vector<int>> out(n + 1);
    // 初始化图
    while (m--) {
        int from, to;
        cin >> from >> to;
        out[from].push_back(to);
        in[to]++;
    }
    // 初始化栈
    stack<int> wait;
    queue<int> res;
    // 遍历邻接表的入度 (因为结点值(入度容器下标)大于等于1,所以从1开始循环)
    for (int v = 1; v < in.size() ; v++) {
        if (in[v] == 0) wait.push(v);
    }
    // 拓扑排序
    while (!wait.empty()) {
        // 删除图中下标序,最后一个结点,并存入结果中
        int val = wait.top();
        wait.pop();
        res.push(val);
        // 删除该结点的边,调整入度容器
        for (auto nodeVal : out[val]) {
            in[nodeVal]--;
            // 将调整后,入度为0的结点存入栈中
            if (in[nodeVal] == 0) wait.push(nodeVal);
        }
    }
    // 有向无环图(DAG)排序后长度为节点个数
    if (res.size() == n){
        // 遍历结果
        for (int i = 0 ; i < n ; i++){
            cout << res.front();
            res.pop();
            if (i != n - 1) cout << ' ';
        }
    } else {
        cout << -1;
    }
}

全部评论

相关推荐

11-08 17:36
诺瓦科技_HR
点赞 评论 收藏
分享
头像
11-09 17:30
门头沟学院 Java
TYUT太摆金星:我也是,好几个华为的社招找我了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务