拓扑排序
知识总结
拓扑排序的定义
对有向无环图(DAG) 的所有顶点排成一个线性序列,使得对于图中的每条有向边 (u, v),u 在序列中排在 v 之前。
条件
- 只有 DAG(有向无环图)才存在拓扑排序
- 如果图中有环,则不存在拓扑排序
- 拓扑排序不一定唯一
Kahn算法(BFS)
- 计算所有顶点的入度
- 将入度为0的顶点加入队列
- 取出队首顶点,输出它
- 将该顶点的所有邻居的入度减1
- 如果邻居入度变为0,加入队列
- 重复3-5直到队列为空
1vector<int> topoSort(int n, vector<vector<int>>& adj) {
2 vector<int> indegree(n, 0);
3 for (int u = 0; u < n; u++)
4 for (int v : adj[u])
5 indegree[v]++;
6
7 queue<int> q;
8 for (int i = 0; i < n; i++)
9 if (indegree[i] == 0)
10 q.push(i);
11
12 vector<int> result;
13 while (!q.empty()) {
14 int u = q.front(); q.pop();
15 result.push_back(u);
16 for (int v : adj[u])
17 if (--indegree[v] == 0)
18 q.push(v);
19 }
20 return result; // 若 result.size() < n,则有环
21}初赛常考
- 给定DAG,写出所有可能的拓扑排序
- 判断给定序列是否是合法的拓扑排序
- 判断图中是否有环(拓扑排序是否能完成)