Algorithm 强连通图的最小加法
我有一组节点和它们之间的一组定向边。边缘没有重量Algorithm 强连通图的最小加法,algorithm,graph-theory,graph-algorithm,Algorithm,Graph Theory,Graph Algorithm,我有一组节点和它们之间的一组定向边。边缘没有重量 我如何才能找到最小数量的边,这些边必须被添加以使图形强连接(即,应该有一条从每个节点到所有其他节点的路径)?这个问题有名字吗?在我看来,使一个有向图强连接的最简单(最少边)的方法就是让所有节点都有一个循环;所以最小的边数应该是N,其中N是节点数。如果已经有边,只需将最长的现有定向路径连接到与当前路径不重叠的下一条最长路径,直到形成一个完整的循环(一旦路径包含所有节点,则连接端点以形成循环) 不确定是否有一个更正式的定义,但对我来说似乎是合乎逻辑的
我如何才能找到最小数量的边,这些边必须被添加以使图形强连接(即,应该有一条从每个节点到所有其他节点的路径)?这个问题有名字吗?在我看来,使一个有向图强连接的最简单(最少边)的方法就是让所有节点都有一个循环;所以最小的边数应该是N,其中N是节点数。如果已经有边,只需将最长的现有定向路径连接到与当前路径不重叠的下一条最长路径,直到形成一个完整的循环(一旦路径包含所有节点,则连接端点以形成循环)
不确定是否有一个更正式的定义,但对我来说似乎是合乎逻辑的。我会找到所有弱连接的组件,并将它们捆绑在一个循环中 编辑: 更明确地说,如果你有WCCs
W(1),…,W(n)
,
使所有
W(i%n+1)
可以从W(i)
中的任何节点访问i=1到n
这是一个非常经典的图问题
这是不正确的。考虑有向图<代码> a> b>代码>。它有两个SCC,但有一个WCC,所以您的算法不会做任何事情。@larsmans在这种情况下,它会在一个循环中绑定单个WCC,即添加边
b->a
。我将添加更多细节,使其更加明确。对不起,我真的不明白你的意思。@larsmans你不同意答案的某些具体部分吗?胡军的回答无论如何要好得多:)我不确定我是否理解这个解决方案。考虑有边的图<代码>(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}
so|X |=|Y |=2
。但是,很明显,我们可以将单条边(d,a)
添加到原始图中,使其强连接。当in degree设置为0时,该算法对以下图失败:(a,b)、(b,d)、(d,b)、(a,c)、(c,e)、(e,c)
,这导致DAG(a,b)、(a,c)
。有max(|X |,| Y |)=1
但我们需要两条边使图形强连接。@mitchus在新的DAG中,A的入度为0,B和C的出度为0。所以| X |=1,| Y |=2,答案是2。我们如何找到所需的最小边(如果可能的话)?