Om + n算法检查有向图是否单边连接

问题描述

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

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

解决方法

使用Tarjan's algorithm查找牢固连接的组件。 SCC中的每个节点都可以相互访问,因此就可以到达和到达的节点而言,它们是等效的。将每个SCC折叠为一个顶点,如果原始图是单边的,则生成的DAG将是单边的。

如果DAG是整体排序,即只有一个拓扑顺序,则DAG是单方面的。如果存在从A到B的路径,那么A必须在B之前。如果存在从B到A的路径,那么B必须在A之前。您将不会同时拥有这两个路径,因为该图现在是非循环的。如果A和B之间没有路径,则它们没有顺序,并且该图至少有2个拓扑顺序-一个在B之前具有A,在A之前具有B。

检查总订单数的快速方法是使用Kahn算法进行topological sort,并检查以确保每次迭代的下一个顶点只有一个选择。

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

,

想法

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

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

角落案例

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

复杂度

查找SCC需2 DFS。 热门排序也需要1 DFS
因此,时间复杂度是您想要的O(V+E)

对此我没有任何正式证据。但这应该可行。让我知道您是否有任何困惑。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...