代码随想录 117. 软件构建

117. 软件构建

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n, m;
    cin >> n >> m;
    vector<vector<int>> graph(n, vector<int>(0));
    vector<int> indgree(n, 0);
    vector<int> result;
    for (int i = 0; i < m; i++){
        int b, e;
        cin >> b >> e;
        indgree[e]++;//记录入度
        graph[b].push_back(e);
    }
    for (int count = 0; count < n;){
        int add = 0;
        for (int i = 0; i < n; i++){
            if (indgree[i] == 0){
                indgree[i]--;//入度置-1,避免后续再被处理
                result.push_back(i);
                for (int j : graph[i]){
                    indgree[j]--;//更新入度
                }
                add++;
            }
        }
        if (add == 0){//若一轮后没有节点入度为0,则表示无法处理
            cout << -1 << endl;
            return 0;
        }
        count += add;
    }
    for (int i = 0; i < n; i++){
        cout << result[i];
        if (i != n - 1) cout << " ";
    }
    return 0;
}

笔者觉得这题本质上可以算做一种有访问条件的bfs,条件就是只有入度为0的节点才能被访问,访问后需要对节点的相邻节点入度做更新。当一个节点入度为0,就代表节点代表的文件的前置任务都已经完成,可以被处理,不断寻找入度为0的节点,直到所有节点都访问过,或有未访问的节点但构成有向环,无法处理。

代码随想录 117. 软件构建

相关推荐
应茶茶23 分钟前
从 C 到 C++:详解不定参数的两种实现方式(va_args 与参数包)
c语言·开发语言·c++
Data_agent29 分钟前
1688获得1688店铺列表API,python请求示例
开发语言·python·算法
2301_764441331 小时前
使用python构建的应急物资代储博弈模型
开发语言·python·算法
code bean1 小时前
【C++】Scoop 包管理器与 MinGW 工具链详解
开发语言·c++
hetao17338371 小时前
2025-12-11 hetao1733837的刷题笔记
c++·笔记·算法
Xの哲學2 小时前
Linux电源管理深度剖析
linux·服务器·算法·架构·边缘计算
小飞Coding2 小时前
一文讲透 TF-IDF:如何用一个向量“代表”一篇文章?
算法
算家计算2 小时前
突然发布!GPT-5.2深夜来袭,3个版本碾压人类专家,打工人该怎么选?
算法·openai·ai编程
saltymilk3 小时前
C++ 语言特性的变更可能让你的防御成为马奇诺防线
c++
Smile丶凉轩3 小时前
C++ 高性能内存池面试题总结
开发语言·c++