Topological Sort
What is topological sort?
有向无环图(DAG)可以表示某种偏序关系,比如要学习 X 知识,我需要先学习 Y 知识和 Z 知识,这在图上表示为 Y -> X 以及 Z-> X 这两条有向边。拓扑排序就是要在这种偏序关系之上加以拓展,建立一个全序关系,且不能破坏原先的偏序关系,也就是,本来 u 在 v 前面,排序之后 u 还是要在 v 前面。直观上来看拓扑排序把原来图中的好几条链变成了一条链,但是不改变原来某条链当中的序关系。
Algorithm for topological sort?
开始我们考虑哪些点可以放在最前面,很显然是那些在各自的链中处于最底层的点,也就是入度为 0 的点,它们不需要前置。选择某个入度为 0 的点 u,加入集合 S,(集合 S 维护的是目前准备加入答案列表的顶点)遍历它的邻接点 v,并删除和它们之间的边,如果此时某个 v 的入度也降为 0,那么我们又回到最初的问题,按照这样的算法递归地解决问题。
code
可以用广度优先搜索来实现拓扑排序
bool toposort(){
queue<int> q;
int cnt = 0;
for(int i = 1; i <= n ; i ++){
if(indeg[i] == 0 && !st[i]){
q.push(i);
st[i] = true;
}
while(q.size()){
int t = q.front();
q.pop();
lst[++cnt] = t;
for(int j = h[t]; j != -1; j = ne[j]){
int k = e[j];
indeg[k]--;
if(indeg[k] == 0 && !st[k]){
q.push(k);
st[k] = true;
}
}
}
}
return cnt == n;
}

浙公网安备 33010602011771号