拓扑排序是一个有向无环图的所有顶点的线性序列。
该序列需要满足每个顶点出现且只出现一次和如果有一条 AA 到 BB 的路径,在序列中 AA 出现在 BB 的前面。
queue <int> Q;
void toposort() {
for(int i = 1; i <= n; i++) {
printf("%d ", i);
Q.push(i);
}
while(Q.size()) {
int x = Q.front(); Q.pop();
for(int i = Head[x]; i; i = Next[i]) {
deg[to[i]]--;
if(deg[to[i]] == 0) {
printf("%d ", to[i]);
Q.push(to[i]);
}
}
}
}
拓扑排序的步骤:
计算每个点的入度。
入度为 00 就加入队列。
当队列不为空则循环:
取出队首元素并输出。
遍历队首元素的连边,对应节点的入度 -1−1。
当对应的节点入度为 00 就加入队列。