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

【模板】拓扑排序

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;
    }
}

全部评论

相关推荐

06-12 16:50
已编辑
小米_软件开发(准入职员工)
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务