计算拓扑排序的两种方法
个人笔记,仅供复习 ——《数据结构编程实验》P351
计算拓扑排序的方法有两种:删边法和采用DFS计算拓扑排序。
1.删边法:
由于每一条拓扑子路径的首节点的入度为0,因此可以采取如下办法:
- 步骤1:从图中选择一个入度为0的点且输出之
- 步骤2:从图中删除该节点及其所有出边(即与之相邻的所有点入度-1)
反复执行这两个步骤,直至所有节点都输出,即整个拓扑排序完成;或者直至剩下的图中再没有入度为0的节点,这就说明此图中有回路,不可能进行拓扑排序。
1.2 算法时间复杂度分析:统计所有节点入度的时间复杂性为(VE);接下来删边花费的时间也是(VE),总花费时间为O(VE)。
1.3 优化:使用队列保存入度为0的顶点,则可以将这个算法复杂度将为O(V+E)。
2.采用DFS计算拓扑排序:
一个有向图是无回路的,当且仅当对图进行DFS遍历时没有反向边B。那么,怎样发现反向边呢?方法很简单:调用DFS(y)算法计算y可达的节点集。若x在该节点集,则<x,y>为反向边,时间复杂度为O(E)。
2.1 由此可以得到用DFS算法计算拓扑方案的方法:以访问一个节点算作一个时间单位,把遍访了u的后代的时间称作结束时间f[u],(f[u]可以通过DFS算法得到)。显然,对图进行DFS遍历时没有反向边B,即对于图中的任意边(u,v),都有f[v] < f[u]。
2.2 时间复杂度分析:DFS的运行时间为O(E),每个节点压入topo栈的时间为O(1),因此执行拓扑排序所需的总时间为O(E)。