从DAG创建强连接组件

时间:2012-10-01 22:05:40

标签: algorithm graph directed-acyclic-graphs

我正在尝试从有向无环图创建强连通组件。

输入是表格中的边缘列表

1 2
3 5
etc

我需要创建一个最小边缘集的出点,将其添加到给定图形中,以生成强连接组件的图形....

有什么想法吗?

以下是我正在寻找的一个例子:

鉴于输入:

1 3
1 4
2 3
2 4
5 7
5 8
6 8
6 9

输出将是添加创建强连接组件所需的最小边数。

输出:

3 1
4 5
7 6
8 1
9 2

2 个答案:

答案 0 :(得分:3)

假设图中没有孤立的顶点,您只需要添加max(| sources |,| sinks |)边以使其强连接。

设T = {t 1 ,...,t n }为汇,{s 1 ,...,s m }是DAG的来源。假设n <= m。 (另一种情况非常相似)。考虑如下定义的两组之间的二分图G(T,S)。 G(T,S)有一个边(t i ,s j )当且仅当从s i 时>Ĵ

令M为G(T,S)中的最大匹配。不失一般性假设M由k​​个边组成:{(t 1 ,s 1 ),(t 2 ,s 2 ),...,(T <子>ķ,S <子>ķ)}。在原始图DAG G中,添加有向边{(t 1 - > s 2 ),(t 2 - &gt; s <子> 3 ),...,(T <子> K-1 - &GT; S <子>ķ),(T <子>ķ - &GT ; S <子> 1 )}。很容易看出,通过添加这些边,M引起的顶点在G中强烈连接。

现在考虑G(T,S)中的剩余顶点。因为M maximal,S-M(相应的T-M)中的每个顶点应该连接到T中的顶点(相应的S-M)。所以我们任意配对剩余的顶点,比如{(t k + 1 ,s k + 1 ),...,(t n , s n )}并在G中添加相应的有向边。对于每个剩余的源顶点源s i (我属于{n + 1,...,m},我们添加G中的边(t 1 - > s i )因此,添加的边总数为max(| sources |,| sinks |)。

编辑:添加几个示例

输入中的示例。我们先计算一个最大匹配,比如说:

3--1
4--2
7--5
8--6

所以我们添加边缘:

3->2
4->5
7->6
8->1

匹配中不存在的剩余(接收器)顶点是9,因此我们将弧从9添加到匹配中的任何源顶点,比如9->1

这是另一个说明算法所有步骤的例子:

输入图表:

12 3   5    9 10  (sources)
\|/   /|\    \/
 4   6 7 8   11   (sinks)

最大匹配:

4--1
6--5
11--9

所以我们添加边缘:

4->5
6->9
11->1

现在剩下的接收器为{7, 8},其余来源为{2, 3, 10}。我们任意配对7说2和8说3并添加:

7->2
8->3

最后,剩下的(源)顶点是10,我们添加:

4->10

答案 1 :(得分:0)

如果我正确理解了您的问题,您应该使用图表的Adjacency Matrix表示。最初,它将是一个稀疏矩阵,其中包含1s或者当前边缘的位置。

使用矩阵的简单遍历,所有0个元素 - &gt; 1您需要创建SCC,并且每个转换都将是您需要添加的边缘。

还有一个很好的维基页面,显示了可能的流行算法:

http://en.wikipedia.org/wiki/Strongly_connected_component

它建议Tarjan'sPath-based算法是最实用的。