拓扑排序

拓扑排序

  • 拓扑排序可视为对图上所有顶点不重不漏的遍历,因此可采用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 @   椰萝Yerosius  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示