[英]O(m+n) algorithm to check if a directed graph is unilaterally connected
给定一个有向图 G=(V,E) 我如何检查它是否是单边连接的,即对于任何两对顶点 a 和 b,至少满足以下条件之一:
使用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 。 这是一个伪算法:
1
的节点视为新图的节点1
,依此类推如果最初的原始图是森林(又名断开),则它不是单边的。
查找SCC
需要 2 个DFS
。 Top Sort 也需要 1 DFS
。
所以,时间复杂度是你想要的O(V+E)
我没有任何正式的证据。 但这应该有效。 如果您有任何困惑,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.