zoukankan      html  css  js  c++  java
  • 拓扑排序

    一.定义

      拓扑排序是将有向无环图(DAG)中的顶点进行线性排序,且该序列满足以下两个条件:

        1.每个顶点出现且仅出现一次;

        2.如果A有一条有向边到达B,那么在排序后的序列中A一定在B前面。

    二.实现方法

      拓扑排序的具体实现步骤如下(<u,v>表示一条u到v的有向边):

        1.找到当前DAG入度为0的点u,将该点从DAG中删除并将其加入到序列中;

        2.将所有<u,v>中v的入度减一;

        3.重复1、2直到DAG中再无入度为0的点时结束。

      具体情况如下:

      

      此时各点的入度分别为(0, 0, 2, 1, 1, 2),可见AB的入度为0,将其从DAG中删除,并将A->C,B->C这两条边删除,将AB放入到序列中得到{A,B},AB的顺序可交换

      此时DAG变成下图:

      

      此时C的入度变为0,其他几个结点入度不变,将C从DAG中删除加入到序列中得到{A,B,C},C不可放到A或B之前,将C->E,C->D这两条边删除

      DAG变成下图:

      

      此时DE的入度均为0,将他们从DAG中删除并放入到序列中,DE顺序可交换但不可与上一个序列中的结点交换位置,同时把E->F,D->F这两条边删除,此时序列为{A,B,C,D,E},最后只剩下F,再将F放入序列即可。

      最终序列为{A,B,C,D,E,F}。

      在代码实现中我们可以借助优先队列来维护各个顶点的入度,具体实现见例题(才不是为了给那两篇博客增加访问量呢~)。

    三.例题

      例题及题解链接:

        1.https://www.cnblogs.com/Dillonh/p/9004027.html

        2.https://www.cnblogs.com/Dillonh/p/9004084.html

       ps.第一道例题的题目中也有拓扑排序的详解,如果看我博客没看懂的可以看那份教程~

  • 相关阅读:
    BSP与HAL关系(转)
    [Advanced Algorithm]
    [Advanced Algorithm]
    [Advanced Algorithm]
    [Intermediate Algorithm]
    [Intermediate Algorithm]
    [Intermediate Algorithm]
    [Intermediate Algorithm]
    [Intermediate Algorithm]
    [Advanced Algorithm]
  • 原文地址:https://www.cnblogs.com/Dillonh/p/10451884.html
Copyright © 2011-2022 走看看