拓扑排序

拓扑排序

  • 拓扑排序可视为对图上所有顶点不重不漏的遍历,因此可采用BFS或DFS实现

  • 拓扑排序的充要条件是其为DAG(有向无环图),若拓扑排序无解说明图该图不是DAG,因此可对图进行判环

  • 若为无向图可看做有向图进行拓扑排序(基环树)

  • 复杂度: O {O} O( V + E V+E V+E)

基于BFS的拓扑排序

无入度点优先(Kahn)

void bfs(){
    queue<vertex>q;//入度为0的队列
    for(int i=1;i<=n;i++)//顶点从1开始
        if(!v[i].in) q.push(v[i]);
    while(q.size()){
        cout<<q.front().d<<' ';
        int work=v[q.front().d].e;//当前工作指针,用于遍历所有依附于该点的边
        while(work!=-1){
            v[e[work].t].in--;
            if(!v[e[work].t].in) q.push(v[e[work].t]);
            work=e[work].n;
        }
        q.pop();
    }
}

扩展:求字典序的拓扑序

将Kahn算法中的队列换为优先队列即可。

无出度点优先

基于DFS的拓扑排序

posted @ 2024-07-23 17:25  椰萝Yerosius  阅读(10)  评论(0)    收藏  举报  来源