繁体   English   中英

O(m+n) 算法来检查有向图是否是单边连接的

[英]O(m+n) algorithm to check if a directed graph is unilaterally connected

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

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

使用Tarjan 算法找到强连通分量。 SCC 中的每个节点都可以从任何其他节点到达,因此就它们可以到达和被哪些节点到达而言,它们是等效的。 将每个 SCC 折叠成一个顶点,如果原始图是单边的,则生成的 DAG 将是单边的。

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

检查全序的一种快速方法是使用 Kahn 算法进行拓扑排序,并检查以确保每次迭代时下一个顶点只有一个选择。

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

主意

这个想法是使用SCC (强连接组件)和 Top Sort 。 这是一个伪算法:

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

角箱

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

复杂

查找SCC需要 2 个DFS Top Sort 也需要 1 DFS
所以,时间复杂度是你想要的O(V+E)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM