单连通图是有向图,从 u 到 v ∀ u,v. 最多有 1 条路径。 我想到了以下解决方案:
从任意顶点运行 DFS。
这是对的吗?或者有更好的解决办法吗
更新:最多 1 个简单路径。
每个节点至少有一些链接(传入或传出),同一组件中的每个节点至少有一个节点。 我们需要做的就是检查同一个组件是否存在这样的链接。
单连通分量可以计算如下:
将图转换为其无向图
否则,它包含由相应领导者表示的多个单连接子图。
如果我们从初始顶点沿着两条不同的简单路径遇到相同的顶点,则该图不是单连通的。相反,如果我们发现任何初始顶点都没有这种情况,则该图是单连通的。
def DFS(self, node: int, visited: List[int]) -> None:
"""
Performs DFS on the graph
"""
visited[node] = 1
for neighbour in self.nodes[node]:
if self.SC_ORIENTED == 0:
return
if visited[neighbour] == 2:
self.SC_ORIENTED = 0
return
if visited[neighbour] == 0:
self.DFS(neighbour, visited)
visited[node] = 2
def is_SC_oriented(self) -> bool:
"""
self.nodes: dict with nodes as keys and set of its neighbours as values
"""
if len(self.get_undirected_edges()) != 0:
raise Exception("Graph is not undirected!")
self.SC_ORIENTED = -1
visited = [0]*len(self.nodes)
for node in self.nodes:
if visited[node] == 0:
self.DFS(node, visited)
if self.SC_ORIENTED == 0:
return False
return True
该算法运行时间为 O(V*E)。 在下面的论文中可以找到一种在 O(V^2) 时间内运行的更高效的算法。
亚当·L·布赫斯鲍姆和马丁·C·卡莱尔。确定有向图中的单连通性。信息处理快报,48(1):9–12,1993。