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