拓扑排序(Topological Sort)是对有向无环图(DAG)中所有顶点进行线性排序,使得对于每条有向边 (u→v),u 在排序中总出现在 v 之前。
简单说:给你一堆有先后依赖关系的任务,排出一个合法的执行顺序。典型应用——课表安排、编译依赖、任务调度。
BFS 做法(Kahn 算法):维护每个节点的入度(被几条边指向)。把所有入度为 0 的点入队,每次取出一个点,把它指向的邻居入度减 1,减到 0 就入队。最后如果输出的节点数 ≠ 总节点数,说明有环。
numCourses 门课程,记为 0 到 numCourses - 1。某些课程有先修要求,比如 [1, 0] 表示想学课程 1 必须先学课程 0。prerequisites,判断是否可能完成所有课程。如果可以,返回任意一个合法的学习顺序。#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> adj(n);
vector<int> indeg(n, 0);
for (int i = 0; i < m; i++) {
int a, b; cin >> a >> b;
adj[b].push_back(a); // 先学 b 再学 a
indeg[a]++;
}
queue<int> q;
for (int i = 0; i < n; i++)
if (indeg[i] == 0) q.push(i);
vector<int> order;
while (!q.empty()) {
int u = q.front(); q.pop();
order.push_back(u);
for (int v : adj[u]) {
indeg[v]--;
if (indeg[v] == 0) q.push(v);
}
}
if ((int)order.size() != n) cout << -1 << endl;
else {
for (int x : order) cout << x << " ";
cout << endl;
}
return 0;
}
// 输入: 4 4 / 1 0 / 2 0 / 3 1 / 3 2
// 输出: 0 1 2 3