基于入度递减 Kahn 排队删除搜索状态机,高亮演示无环线性序排列及环路检测
拓扑排序(Topological Sort)是对有向无环图(DAG)的顶点的一种线性排序,使得若存在一条有向边 $u \to v$,则在序列中 $u$ 必排在 $v$ 之前。
queue 中。in_degree[v]--)。vector<int> topo; // 记录拓扑排序输出序列
int indegree[MAXN]; // 记录每个顶点的入度
bool kahn() {
queue<int> q;
// 将所有初始入度为 0 的节点推入队列
for (int i = 0; i < n; i++) {
if (indegree[i] == 0) q.push(i);
}
while (!q.empty()) {
int u = q.front(); q.pop();
topo.push_back(u); // 出队并记入拓扑序列
for (int v : g[u]) {
indegree[v]--; // 割裂连线,消除入度计数
if (indegree[v] == 0) {
q.push(v); // 依赖全部清除的节点进入队列
}
}
}
// 若拓扑输出点数不足 n,说明图中有环!
return topo.size() == n;
}