使用强连接组件Algo检查顶点是否可达

时间:2012-10-18 09:05:35

标签: algorithm graph

我想看看图G中的所有其他顶点是否可以到达给定顶点,比如V0。
我知道我可以遍历图中的每个顶点并执行BFS / DFS以查看V0是否可以到达。
但是,这似乎效率很低。

我想知道我是否在图上做了SCC算法,如果v0是所有scc的一部分,那么我可以安全地得出结论v0可以通过所有顶点到达吗?这将是很好的,因为SCC的成本仅为与Tarjan的O(V + E)并且检查v0是否是scc的一部分也将花费线性时间。

我认为这是有道理的,因为SCC意味着顶点是可达的。对这个逻辑的任何确认?

或任何有效的方法?

2 个答案:

答案 0 :(得分:5)

V0可能不属于SCC,但仍可通过所有其他顶点到达。例如,图上的顶点d可由所有其他顶点到达,但唯一的非平凡SCC包含顶点abc且不包含顶点{ {1}}。

enter image description here

要检查V0是否可以被所有其他顶点到达,您可以反转每个边的方向(以线性时间),然后使用BFS / DFS,从V0开始,检查是否可以从V0到达每个其他顶点(也在线性时间)。

答案 1 :(得分:1)

让我们调用一个顶点,其中所有其他顶点都是可到达的,一个顶点。如果 图形有一个vista顶点,那么它必须只有一个源SCC(因为两个源SCC 彼此无法访问),必须包含vista顶点(如果它在任何其他顶点) SCC,没有从vista顶点到源SCC的路径)。而且,在这种情况下每一个 源SCC中的顶点将是vista顶点。 然后该算法简单地从任何节点开始到DFS并用该标记顶点 最高的完成时间。这必须在源SCC中。我们现在再次运行DFS 顶点检查我们是否可以到达所有节点。由于算法只是使用分解 SCC和DFS,运行时间是线性的。 这个算法是正确的。请注意,当且仅当只有一个顶点时,才会存在vista顶点 来源SCC。源SCC中的任何顶点只能由同一SCC中的其他顶点到达, 所以没有顶点可以到达两个不同的源SCC中的顶点。此外,如果只有 一个源SCC,该SCC中的任何顶点都是远景顶点,因为它们都可以从每个顶点到达 其他。请注意,在任何特定SCC中启动的DFS在完成所有SCC之前都不会完成 可以从中找到它。这意味着要完成的最后一个节点位于SCC中 无法从任何其他SCC(即源SCC)访问。因此在我们的第一部分 算法我们在源SCC中找到一个节点。通过执行DFS,我们将正确确定 无论它是否是远景顶点,如果它不是远景顶点,我们知道它们都不存在 我们的图表。