从我理解的一点点来看,如果你有一个针对强连接组件的现成高效黑盒方法,那么进行拓扑排序的一种方法是:
(假设 - 没有自我循环)
无论效率如何,以上是一种“技术上正确”的拓扑排序方式吗?
我只是想确保我理解正确的事情。
答案 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,因为它不会为您提供任何额外的有用信息。