使用强连接组件进行拓扑排序以查找循环(​​有向图)

时间:2015-06-01 19:26:38

标签: algorithm topological-sort connected-components

从我理解的一点点来看,如果你有一个针对强连接组件的现成高效黑盒方法,那么进行拓扑排序的一种方法是:

(假设 - 没有自我循环)

  1. 运行强连接组件
  2. 如果您有一个或多个尺寸组件> 1然后该图表有周期。
  3. else(图中只有1个大小的组件)它是DAG,恭喜!
  4. 如果它是DAG运行拓扑排序,否则抱怨你不能这样做。
  5. 无论效率如何,以上是一种“技术上正确”的拓扑排序方式吗?

    我只是想确保我理解正确的事情。

2 个答案:

答案 0 :(得分:2)

是的,它在技术上是正确的,因为没有自循环的有向图是非循环的(即拓扑可排序的),如果所有强组件都具有大小1.最常见的拓扑排序将循环检测作为一种简单的副产品来进行。

答案 1 :(得分:1)

扩展上面的答案:是的,上面介绍的算法是正确的,将产生您想要的答案。拓扑排序仅适用于DAG(有向无环图)。 SCC是一组顶点,其中每个顶点都可以到达其他每个顶点,并且本质上是循环的。因此,DAG应该具有大小为1的V#个SCC分量。

但是,该算法中有很多冗余,因为SCC算法通常是使用运行时间为O(V + E)的DFS实现的,具体取决于存储数据的方式,可能接近O(V ^ 2)和图的密度。生成所有SCC并查看所有顶点以检查它们是否存在> 1的SCC会生成O(2V + E),实际上仍然只是O(V + E),但最终需要额外存储Θ( V)用于SCC。

此外,拓扑排序还利用DFS,DFS可以检测周期,因此可以发出信号通知拓扑排序是否可能。这也可以在O(V + E)中运行。因此,您可以简单地运行拓扑排序,而不必使用SCC算法。尽管算法的总体大O与拓扑排序的运行时间相同,但无需运行SCC,因为它不会为您提供任何额外的有用信息。