我需要找到一种算法,用于在有向图中找到所有根,在O(n + m)中。
我有一个查找单根的算法:
现在,如果我想找到所有的根,那么每次在最后一棵树的不同顶点上运行上述算法O(n)次的最佳方法是什么?假设我找到了一个根,如果存在另一个根,那么它必须在最后一棵树上,那么如果我继续运行上述算法直到收到“没有根存在”或者直到遍历所有顶点,那么它是O(n + m)吗?
提前致谢!
答案 0 :(得分:4)
两种方法:
反转图形并计算DFS-loop()并记下没有外边缘的顶点(如Abhishek所说)。
更高效 - 在图表上运行DFS-loop()并使用true,false表跟踪没有传入边的顶点。
在最坏的情况下,方法1需要两倍的时间。
答案 1 :(得分:0)
首先,您应该在图表中找到所有强关联组件。要在更精简的时间内构建它,您可以使用Kosaraju's algorithm或Tarjan's algorithm。所有根应位于一个这样的组件中。接下来,您会发现没有传入边缘的强连接组件。如果您有多个这样的组件,则图形没有根顶点。在您只有一个组件的情况下,您应该检查是否可以从中获取其他组件,在这种情况下,此组件包含图中的所有根。
旧变种。
您应该计算到顶点的传入边数,这可以在O(m)中完成。所有具有零个入射边的顶点都将是图的根,为此您将需要O(n)时间。