拓扑排序

一.定义

  拓扑排序是将有向无环图(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.第一道例题的题目中也有拓扑排序的详解,如果看我博客没看懂的可以看那份教程~

posted @ 2019-02-28 17:37  Dillonh  阅读(331)  评论(0编辑  收藏  举报