【问题标题】:O(m+n) algorithm to check if a directed graph is unilaterally connectedO(m+n) 算法来检查一个有向图是否是单边连接的
【发布时间】:2020-10-13 00:53:42
【问题描述】:

给定一个有向图 G=(V,E) 我如何检查它是否是单边连接的,即对于任意两对顶点 a 和 b,至少满足以下条件之一:

  1. 有一条从 a 到 b 的路径。
  2. 有一条从 b 到 a 的路径。

【问题讨论】:

标签: algorithm data-structures graph graph-theory graph-algorithm


【解决方案1】:

找到强连通分量,比如Tarjan's algorithm。 SCC 中的每个节点都可以从任何其他节点到达,因此它们在可以到达和被哪些节点到达方面是等价的。将每个 SCC 折叠成一个顶点,如果原始图是单边的,则生成的 DAG 将是单边的。

如果 DAG 是全序的,即只有一个拓扑序,则 DAG 是单边的。如果有从 A 到 B 的路径,那么 A 必须在 B 之前。如果有从 B 到 A 的路径,那么 B 必须在 A 之前。你不会同时拥有两者,因为图现在是无环的。如果 A 和 B 之间没有路径,则它们是无序的,并且图至少有 2 个拓扑顺序 - 一个是 A 在 B 之前,一个是 B 在 A 之前。

检查总顺序的一种快速方法是使用卡恩算法执行topological sort,并检查以确保在每次迭代中下一个顶点只有一个选择。

Tarjan 用于查找 SCC、折叠 SCC 的算法,以及用于拓扑排序的 Kahn 算法,都在 O(V+E) 时间内运行。

【讨论】:

    【解决方案2】:

    想法

    这个想法是使用SCC(强连接组件)和顶级排序。这是一个伪算法:

    • 首先找到原始 Graph 的 SCC。在您的每个 SCC 中,都有一条从一个顶点到另一个顶点的路径。
    • 将新找到的 SCC 图压缩为新图。想法是将属于 SCC 1 的所有节点视为新图的节点 1,依此类推
    • 现在,我们需要运行 DFS 来检查是否只有一个连接的组件。但是我们不能只从任何节点运行 DFS,因为这是一个有向图。我们使用顶级排序来查找拓扑顺序,然后运行 ​​DFS 来检查是否只有一个组件。如果有多个,则图形不是单边的。

    角落案例

    如果最初的原始图是森林(又名断开连接),则它不是单边的。

    复杂性

    查找 SCCs 需要 2 个 DFS 。 顶级排序也需要 1 DFS .
    所以,时间复杂度是你想要的O(V+E)

    对此我没有任何正式的证据。但这应该可行。如果您有任何困惑,请告诉我。

    【讨论】:

    • 考虑从子顶点 A 到子顶点 B 的有向边,其中 A、B 表示压缩步骤后的强连通分量。因此,子顶点 B 内的任何节点都应该可以被 A 的子顶点内的任何节点访问,但反之则不行。该图看起来像:A -> B,所以这里的 SCC 为 0。算法给出的不是单边的。我错过了什么吗?
    • 你是对的,我完全忘记了其中一个条件必须为真,而不是两者都为真。我进行了编辑
    • A->B, A->C, B->D, C->D 有一个连通分量并且不是森林,但也不是单边的,因为从 B 到没有路径C 或反之亦然。 “我没有证据,但它应该可以工作”通常是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2019-08-20
    • 2019-06-17
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多