Algorithm 从DAG创建强连接零部件
我试图从有向无环图中创建强连接的组件 输入是表单中的边列表Algorithm 从DAG创建强连接零部件,algorithm,graph,directed-acyclic-graphs,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 如果我正确理解了您的问题,您应该使用图形的邻接矩阵表示。最初,它将是一个1的稀疏矩阵,或者是当前边所在的位置 使用矩阵的简
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
如果我正确理解了您的问题,您应该使用图形的邻接矩阵表示。最初,它将是一个1的稀疏矩阵,或者是当前边所在的位置 使用矩阵的简单遍历,创建SCC所需的所有0元素->1,每个转换都将是需要添加的边 还有一个很好的wiki页面,显示了用于此目的的可能流行算法:
它推荐了最实用的方法和算法。假设图中没有孤立的顶点,您只需添加max(| sources |,| sinks |)边即可使其强连接 设T={t1,…,tn}为汇,{s1,…,sm}为DAG的源。假设n2),(t2->s3),…,(tk−1->sk,(tk->s1)}。很容易看出,通过添加这些边,由M诱导的顶点在G中是强连通的
现在考虑G(t,s)中的剩余顶点。因为M最大,S中的每个顶点−M(分别为T−M) 应连接到T(分别为S)中的顶点−M) 。所以我们任意配对剩余的顶点,比如{(tk+1,sk+1),…,(tn,sn)},并在G中添加相应的有向边。对于每个剩余的源顶点源si(i属于{n+1,…,m}),我们在G中添加边(t1->si)。因此添加的边的总数是最大的(|源|,|汇|)
编辑:添加几个示例 对于输入中的示例,我们首先计算最大匹配,例如:3--1
4--2
7--5
8--6
因此,我们添加了边:
3->2
4->5
7->6
8->1
4->5
6->9
11->1
匹配中不存在的剩余(汇)顶点是9,因此我们将从9到匹配中的任何源顶点添加弧,例如9->1
下面是另一个示例,说明了算法的所有步骤:
输入图形:
12 3 5 9 10 (sources)
\|/ /|\ \/
4 6 7 8 11 (sinks)
最大匹配:
4--1
6--5
11--9
因此,我们添加了边:
3->2
4->5
7->6
8->1
4->5
6->9
11->1
现在剩下的汇是{7,8}
,剩下的源是{2,3,10}
。我们将7与say 2任意配对,将8与say 3任意配对,并添加:
7->2
8->3
最后,剩余(源)顶点为10,我们添加:
4->10
不清楚你的意思是什么。每个顶点本身形成一个强连接的组件。所以你不必添加任何边。但我想你心里有一个不同的问题?@krjampani你说的是真的…但是当有一个图,它们可能没有连接时,这些就变成了组件。我正在尝试创建一个算法来连接它们有效地ct这些未连接的图,以便它们成为强连接组件。因此,是否要将每个弱连接组件转换为强连接组件?如果弱连接组件是DAG,则可以通过将所有可能的边从汇顶点添加到源顶点来使其强连接。这些也要最小。@krjampani这很有意义!我正试图把它的复杂性降低到线性时间。这可能吗?想法?你能在图中添加新的顶点以使其强连接吗?你到底想要一个强连接的组件吗?你能提供一个你想要的例子吗?我刚刚阅读了算法还有两个后续问题。1.从我的阅读来看,这些算法似乎是用来识别强连接的组件,而不是找到需要添加哪些边来创建它们,因此我不确定如何实现。2.如果我使用邻接矩阵表示,并简单地将所有0个元素设为1来创建新的edge,我最终会得到一个完全连通的图,不是吗?不是创建强连通组件所需的最小边数谢谢!不过我很难理解它…你认为你可以用我的示例数据一步一步地研究它吗?我目前正在做这件事,但我不太清楚。我真的很感激e it.不客气。添加了几个示例。希望它们能更清楚地表达出来。投票一百万次!但是,我确实有几个更清楚的问题…首先,你能解释更多关于最大匹配的内容吗?以及如何识别它吗?其次,我数了7条边添加到你的示例中。根据假设,应该只有5条边吗n添加的顶点的最小数量应为MAX(源、汇),因为源=5,汇=5?*添加的边(非顶点)的数量您是对的。第二个示例存在一个小问题。现在已修复。但请注意,源的数量为6,因此需要添加6条边。