美文网首页
拓扑排序

拓扑排序

作者: 放开那个BUG | 来源:发表于2020-08-19 23:38 被阅读0次

    1、介绍

    拓扑排序主要应用于有向无环图,所谓的有向无环图指的是,图中没有环。如图:


    有向无环图

    拓扑排序是一个有向无环图的所有顶点的线性序列。且该序列必须满足下面两个条件:

    • 1、每个顶点出现且只出现一次。
    • 2、若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

    2、拓扑排序的方法

    一种比较常用的方法:

    • 1、从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。
    • 2、从图中删除该顶点和所有以它为起点的有向边。
    • 3、重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。


      方法

    3、拓扑排序的应用

    拓扑排序通常用来“排序”具有依赖关系的任务。

    比如,如果用一个DAG图来表示一个工程,其中每个顶点表示工程中的一个任务,用有向边 表示在做任务 B 之前必须先完成任务 A。故在这个工程中,任意两个任务要么具有确定的先后关系,要么是没有关系,绝对不存在互相矛盾的关系(即环路)。

    引申到任务那块,任务如果有相互依赖,是不是也是那种有向无环图?

    4、代码实现

    
    int topo()
    {
        queue<int>q;
    
        // 将所有入度为0的顶点加入
        for(inti=1;i<=n;i++)
        {
            if(indegree[i]==0)
            {
                q.push(i);
            }
        }
     
        int temp;
        while(!q.empty())
        {
            temp=q.pop();
            for(inti=1;i<=n;i++)//遍历从temp出发的每一条边,入度--
            {
                if(map[temp][i])
                {
                    indegree[i]--;
                    if(indegree[i]==0)q.push(i);
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:拓扑排序

          本文链接:https://www.haomeiwen.com/subject/vndjjktx.html