用于查找有向图的每个弱连通分量的算法

时间:2016-03-18 18:17:15

标签: algorithm graph graph-algorithm connected-components

我正在寻找一种算法来查找有向图中的每个弱连通分量。我知道对于无向图,你可以通过dfs来做到这一点,但这显然对有向图有效。我将图形保存为邻接列表。 例如:

A -> B
B -> C
D -> X

因此A-B-C是连接组件和D-X

我不是在寻找寻找强连通组件的算法!!

2 个答案:

答案 0 :(得分:3)

除非您的内存限制太严格,否则您可以保留第二个临时邻接列表。在第二个邻接列表中,您将每个边放置为a-> b,并且还将边沿反向放置。 (即b-> a)然后,您可以在该邻接列表上使用DFS来查找连接的组件。

答案 1 :(得分:2)

一个非常简单的解决方案如下:
首先从给定图形创建无向图 - 只需复制并将每条边的反向添加到边集。创建顶点集的副本,从任意顶点开始,DFS遍历包含顶点的组件,从集合中删除所有遍历的节点并将它们添加到列表中。重复此操作,直到列表为空。

在伪代码中:

bimap edges
edges.putAll(graph.edges())

set vertices = graph.vertices()

list result

while !vertices.isEmpty()
    list component

    vertex a = vertices.removeAny()
    dfsTraverse(a , v -> {
        vertices.remove(v)
        component.add(v)
    })

    result.add(component)