基于入度的拓扑排序(Kahn's Algorithm)

来源:互联网 发布:新浪微博微数据 编辑:程序博客网 时间:2024/04/29 13:55

本文中的图用邻接链表来表示

拓扑排序只针对于有向无环图(DAG)才能完成,所以可以利用拓扑排序来判断一个有向图是否有环

某一点的入度:图中指向该顶点的边的个数


图1 :DAG

以上图简单说明,点0的入度即为2。下面介绍拓扑排序的算法流程:

Step 1:计算出所有顶点的入度。

Step2 :将所有入度为0的点加入到一个队列。

Step3 :将队头元素取出,然后pop()。

   1.count变量表示访问过的顶点个数,将count加1.

       2.用top数组将每一次出队的元素保存起来。

          3.将这个点的所有相邻点的入度减一,如果某个相邻点的入度减小为0,则将这个相邻点加入到队列中。

Step4 :重复Step3直到队列为空

Step5 :如果count和顶点个数相同,则将top数组中的元素按序输出就是排序后的结果;如果count不等于顶点个数

     (在不相等的情况下,一般是count大于顶点个数),说明图中存在环,拓扑排序无法完成。


入度的计算方法:

遍历所有的顶点,每一次遍历,将该点所有相邻的点的入度都加1。所有的点遍历完后,入度就计算完成了。


具体拓扑排序代码如下:



结果是:4 5 2 0 3 1

      

1 0