8

我想看看一个给定的顶点,比如 V0,是否可以被图 G 中的所有其他顶点访问。
我知道我可以遍历图中的每个顶点并执行 BFS/DFS 以查看 V0 是否可达。
然而,这似乎是非常低效的。

我想知道我是否在图表上执行 SCC 算法,如果 v0 是所有 scc 的一部分,那么我可以安全地得出结论,所有顶点都可以访问 v0?这会很好,因为 SCC 的成本只有 Tarjan 的 O(V+E) 并且检查 v0 是否是 scc 的一部分也将花费线性时间。

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

或任何有效的方法?

4

2 回答 2

5

V0 可能不属于 SCC,但仍可被所有其他顶点访问。例如,d所有其他顶点都可以访问图表上的顶点,但唯一的非平凡 SCC 包含 vertices abc并且不包含 vertex d

在此处输入图像描述

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

于 2012-10-18T09:54:18.213 回答
1

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

于 2012-10-22T09:45:22.153 回答