【发布时间】:2013-11-25 20:20:46
【问题描述】:
我需要找到一种算法,以在 O(n+m) 时间内找到有向图中的所有根。
我有一个寻找单根的算法:
- 在 V 中的某个 v 上运行 DFS(v)。如果结果是单生成树,则 v 是根。否则,结果就是一片树林。然后:
- 在最后一棵树的根上运行 DFS(u)。如果结果是单生成树,则 u 是根。否则,图中没有根。
现在,如果我想找到所有的根,每次在最后一棵树的不同顶点上运行上述算法 O(n) 次的最佳方法是什么?假设我找到了一个根,如果另一个根存在,那么它必须在最后一棵树上,那么如果我继续运行上述算法直到收到“不存在根”或直到遍历所有顶点,它是 O(n+m) 吗?
提前致谢!
【问题讨论】:
-
查找拓扑排序。你的问题仍然没有意义。术语
root仅为根定义。我假设您需要没有传入边的所有顶点? -
@IvayloStrandjev ...称为"source vertices"。
-
假设您已经正确找到了一个根,然后您可能会找到具有指向该根的路径的顶点。所有这样的顶点都应该是根本身。或者您可以反转所有边的方向并从找到的根执行 DFS 或 BFS。遇到的所有顶点都应该是根。
-
@amitooshacham 正如我所说,IMO 如果你反转所有边的方向并从根进行 DFS 或 BFS,那么你可以获得所有新的根。
-
是的,反转所有边是 O(n),其中 n 是边数。
标签: algorithm tree root directed-graph