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;
}
posted @ 2021-05-12 21:11  今天AC了吗  阅读(49)  评论(0)    收藏  举报