117. 软件构建
#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. 软件构建