在有向图中查找所有根

时间:2013-11-13 09:40:52

标签: algorithm tree root directed-graph

我需要找到一种算法,用于在有向图中找到所有根,在O(n + m)中。

我有一个查找单根的算法:

  1. 在V中的某些v上运行DFS(v)。如果结果是单个生成树,则v是根。否则,结果就是一片树林。然后:
  2. 在最后一棵树的根目录上运行DFS(u)。如果结果是单个生成树,则u是根。否则,图表中没有根。
  3. 现在,如果我想找到所有的根,那么每次在最后一棵树的不同顶点上运行上述算法O(n)次的最佳方法是什么?假设我找到了一个根,如果存在另一个根,那么它必须在最后一棵树上,那么如果我继续运行上述算法直到收到“没有根存在”或者直到遍历所有顶点,那么它是O(n + m)吗?

    提前致谢!

2 个答案:

答案 0 :(得分:4)

两种方法:

  1. 反转图形并计算DFS-loop()并记下没有外边缘的顶点(如Abhishek所说)。

  2. 更高效 - 在图表上运行DFS-loop()并使用true,false表跟踪没有传入边的顶点。

  3. 在最坏的情况下,方法1需要两倍的时间。

答案 1 :(得分:0)

首先,您应该在图表中找到所有强关联组件。要在更精简的时间内构建它,您可以使用Kosaraju's algorithmTarjan's algorithm。所有根应位于一个这样的组件中。接下来,您会发现没有传入边缘的强连接组件。如果您有多个这样的组件,则图形没有根顶点。在您只有一个组件的情况下,您应该检查是否可以从中获取其他组件,在这种情况下,此组件包含图中的所有根。

旧变种。

您应该计算到顶点的传入边数,这可以在O(m)中完成。所有具有零个入射边的顶点都将是图的根,为此您将需要O(n)时间。