我正在尝试从有向无环图创建强连通组件。
输入是表格中的边缘列表
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
答案 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's和Path-based算法是最实用的。