【发布时间】:2020-10-13 00:53:42
【问题描述】:
给定一个有向图 G=(V,E) 我如何检查它是否是单边连接的,即对于任意两对顶点 a 和 b,至少满足以下条件之一:
- 有一条从 a 到 b 的路径。
- 有一条从 b 到 a 的路径。
【问题讨论】:
标签: algorithm data-structures graph graph-theory graph-algorithm
给定一个有向图 G=(V,E) 我如何检查它是否是单边连接的,即对于任意两对顶点 a 和 b,至少满足以下条件之一:
【问题讨论】:
标签: algorithm data-structures graph graph-theory graph-algorithm
找到强连通分量,比如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) 时间内运行。
【讨论】:
这个想法是使用SCC(强连接组件)和顶级排序。这是一个伪算法:
1 的所有节点视为新图的节点 1,依此类推如果最初的原始图是森林(又名断开连接),则它不是单边的。
查找 SCCs 需要 2 个 DFS 。
顶级排序也需要 1 DFS .
所以,时间复杂度是你想要的O(V+E)
对此我没有任何正式的证据。但这应该可行。如果您有任何困惑,请告诉我。
【讨论】: