我有一个特殊问题,即有向图的每个顶点都有四条向外指向的路径(可以指向同一个顶点)。
一开始,我只有起始顶点,我使用DFS来发现/枚举所有顶点和边。
然后我可以使用类似Tarjan的算法来将图形分解为强连接组件。
我的问题是,有没有比发现图表然后应用算法更有效的方法。例如,有没有办法将两部分结合起来以提高效率?
答案 0 :(得分:0)
避免发现"一开始的图形,Tarjan算法需要的关键属性是,在执行的任何时候,它应该只依赖于它迄今为止探索过的子图,它应该只扩展这个探索过的区域通过枚举一些已经访问过的顶点的邻居。 (例如,如果它需要在开始时知道图中节点或边的总数,那么你就会陷入沉没。)从Wikipedia page看,似乎算法确实具有这个属性,所以不,你不需要在开始时执行一个单独的发现阶段 - 你可以发现每个顶点"懒惰"在for each (v, w) in E do
行(枚举v的所有邻居,就像你在发现DFS中所做的那样)和for each v in V do
(只需选择v作为你在上一步中已经发现为aw的任何顶点,但是您尚未通过拨打strongconnect(v)
来访问过该网站。
也就是说,因为你最初的DFS发现阶段只需要线性时间,所以如果消除它会加快速度,我会感到惊讶。如果你的图表太大而且它不适合缓存,那么它可以将总时间减半。