Leetcode刷题 | Day63_图论08_拓扑排序

一、学习任务

二、具体题目

1.拓扑排序117. 软件构建

【题目描述】

某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。请编写一个算法,用于确定文件处理的顺序。

【输入描述】

第一行输入两个正整数 N, M。表示 N 个文件之间拥有 M 条依赖关系。

后续 M 行,每行两个正整数 S 和 T,表示 T 文件依赖于 S 文件。

【输出描述】

输出共一行,如果能处理成功,则输出文件顺序,用空格隔开。

如果不能成功处理(相互依赖),则输出 -1。

拓扑排序:BFS/DFS

本篇方法为BFS

拓扑排序的过程,只有两步:

  1. 找到入度为0 的节点,加入结果集
  2. 将该节点从图中移除

循环以上两步,直到 所有节点都在图中被移除了。

结果集的顺序,就是我们想要的拓扑排序顺序 (结果集里顺序可能不唯一)

cpp 复制代码
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;

int main() {
    int n, m, s, t;
    cin >> n >> m;
    vector<int> inDegree(n, 0); // 记录每个文件的入度
    unordered_map<int, vector<int>> umap; // 记录文件依赖关系
    vector<int> result; // 记录处理文件顺序
    while (m--) {
        // s->t,先有s再有t
        cin >> s >> t;
        inDegree[t]++; // t入度+1
        umap[s].push_back(t); // 把s指向的文件放入对应的数组
    }

    queue<int> que;
    for (int i = 0; i < n; i++) {
        // 入度为0的文件,可以作为开头,先加入队列
        if (inDegree[i] == 0) que.push(i);
    }
    while (!que.empty()) {
        int cur = que.front(); // 当前入度为0的第一个文件
        que.pop(); // 弹出处理过的
        result.push_back(cur); // 处理过的放入结果集
        vector<int> files = umap[cur]; // 获取该文件所指向的所有文件
        if (!files.empty()) { // 如果该节点有指向的文件
            for (int i = 0; i < files.size(); i++) {
                inDegree[files[i]]--; // 删除节点 = 把cur指向的所有文件入度减一
                if (inDegree[files[i]] == 0) que.push(files[i]);
            }
        }
    }
    if (result.size() == n) {
        for (int i = 0; i < n - 1; i ++) {
            cout << result[i] << " ";
        }
        cout << result[n - 1] << endl;
    }
    else {
        cout << -1 << endl;
    }
    return 0;
}
相关推荐
老四啊laosi18 小时前
[C++进阶] 24. 哈希表封装unordered_map && unordered_set
c++·哈希表·封装·unordered_map·unordered_set
2301_7644413318 小时前
LISA时空跃迁分析,地理时空分析
数据结构·python·算法
东北洗浴王子讲AI18 小时前
GPT-5.4辅助算法设计与优化:从理论到实践的系统方法
人工智能·gpt·算法·chatgpt
妙为19 小时前
银河麒麟V4下编译Qt5.12.12源码
c++·qt·国产化·osg3.6.5·osgearth3.2·银河麒麟v4
Billlly19 小时前
ABC 453 个人题解
算法·题解·atcoder
玉树临风ives19 小时前
atcoder ABC 452 题解
数据结构·算法
feifeigo12320 小时前
基于马尔可夫随机场模型的SAR图像变化检测源码实现
算法
fengfuyao98520 小时前
基于STM32的4轴步进电机加减速控制工程源码(梯形加减速算法)
网络·stm32·算法
无敌昊哥战神21 小时前
深入理解 C 语言:巧妙利用“0地址”手写 offsetof 宏与内存对齐机制
c语言·数据结构·算法
小白菜又菜21 小时前
Leetcode 2075. Decode the Slanted Ciphertext
算法·leetcode·职场和发展