我有一组节点和它们之间的有向边集。这些边没有权重。
如何找到最小数量的需要添加的边,使得图强连通(即每个节点都能到达所有其他节点)?这个问题有一个名称吗?
我有一组节点和它们之间的有向边集。这些边没有权重。
如何找到最小数量的需要添加的边,使得图强连通(即每个节点都能到达所有其他节点)?这个问题有一个名称吗?
这是一个非常经典的图论问题。
就我个人而言,似乎最简单(边数最少)使有向图强连通的方法是只有涉及所有节点的循环; 因此,最小边数将仅为N,其中N是节点数。如果已经存在边,则可以执行以下操作:将最长的现有有向路径连接到下一个不与当前路径重叠的最长路径,直到形成完整的循环(一旦您的路径包含所有节点,请连接端点以形成循环。)
不确定是否有更正式的定义,但对我来说似乎是合乎逻辑的。
我将找到所有弱连接的组件,并将它们绑在一个循环中。
编辑:
更明确地说,我的想法是如果你有WCCs W(1),...,W(n)
,使得W(i%n + 1)
可以从W(i)
的任何节点到达,对于i=1 to n
。
a -> b
。它有两个强连通分量,但只有一个弱连通分量,所以你的算法什么也做不了。 - Fred Foob->a
。我会添加更多细节以使其更明确。 - mitchus
(a,b),(b,e),(e,b),(a,c),(c,f),(f,c),(b,d),(c,d)
的图表。结果的 DAG 是(A,B),(A,C),(B,D),(C,D)
,其中B={b,e}
和C={c,f}
。因此X=Y={B,C}
,因此|X|=|Y|=2
。然而,显然,我们只需要添加单条边(d,a)
到原始图形即可使其强连通。 - mitchus(a,b),(b,d),(d,b),(a,c),(c,e),(e,c)
,结果为DAG(A,B),(A,C)
。在这里,max(|X|,|Y|)=1
,但我们需要两条边来使图形强连通。 - mitchus