【问题标题】:How to find if a path exists from one SCC to another?如何查找从一个 SCC 到另一个 SCC 的路径是否存在?
【发布时间】:2018-04-17 08:43:10
【问题描述】:

对于一个图,在找到强连通分量之后,如何找到彼此有路径的 SCC 的数量?我想查找是否有从 SCC1 到 SCC2 的路径。

【问题讨论】:

  • 您的尝试是什么,为什么您认为它有问题?实际上,答案对我来说似乎很明显。
  • 我的方法是在 SCC1 的顶点上运行 DFS。我发现它有问题,因为并非所有 SCC 都可能有通往彼此的路径。如果我从一个开始,我想知道如何达到最大 SCC 数量。
  • 只是为了确定:它是有向图吗?如果是这样,那么连接两个 SCC 是什么意思?它们是否必须可以相互访问?
  • 是的,它是一个有向图。我的意思是如果我可以从另一个 SCC 到达。它们不必可达,但如何找到它们是否可达?
  • 是“我想查找是否有从 SCC1 到 SCC2 的路径”还是“我想查找是否有从 SCC1 到 SCC2 的路径以及从 SCC2 到 SCC1 的路径”?

标签: algorithm strongly-connected-graph


【解决方案1】:

在使用 Kosaraju 查找 SCC 时(因为它易于实现)为每个 SCC 发现者(也称为代表)分配一个唯一的 ID,并且对于每个 SCC,将其 ID 分配给它的所有成员。这将有助于记住哪个成员属于哪个 SCC。现在这个信息可以帮助我们把这个图压缩成一个图,每个节点都是SCC(representative ID)。在构建此压缩图时,您将知道哪个 SCC 与哪个 SCC 相连。
您可以参考此链接了解更多详细信息以及实现:https://cp-algorithms.com/graph/strongly-connected-components.html

【讨论】:

    【解决方案2】:

    假设您只需要知道一个 SCC 是否可以从另一个 SCC 访问(真/假),您可以在发现一个 SCC 时为每个 SCC 分配一个身份,并为其所属的 SCC_ID 的每个节点创建一个映射.然后再次遍历原始图。如果存在一条边(u,v),而SCC_ID(u) != SCC_ID(v) 则可以从另一个SCC 到达。

    类似的问题:Kosaraju's Algorithm for finding SCCs but keep track of edge between SCCs?

    【讨论】:

      【解决方案3】:

      你问了两件事:

      如何找到彼此有路径的 SCC 的数量?

      您可以从每个 SCC 运行 dfs 并保存您可以访问的 SCC。

      例如:你从 SCC A 运行 dfs,你可以到达 SCC B 和 C。(只需检查你正在访问的节点的 SCC 是什么) 然后你从另一个 SCC D 运行 dfs 并到达 SCC A。此时你可以停止你的 dfs,因为你已经计算了其他的是什么。

      所以时间复杂度是O(n+m)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-18
        • 2018-05-16
        • 1970-01-01
        • 2016-08-07
        • 2012-02-09
        • 1970-01-01
        • 2019-08-09
        • 1970-01-01
        相关资源
        最近更新 更多