如何找到最大生成树?

时间:2011-02-14 13:26:14

标签: algorithm minimum-spanning-tree greedy kruskals-algorithm

与最小生成树的Kruskal算法相反的是吗?我的意思是,每一步选择最大重量(边缘)?

找到最大生成树还有其他想法吗?

8 个答案:

答案 0 :(得分:58)

是的,

来源:https://web.archive.org/web/20141114045919/http://www.stats.ox.ac.uk/~konis/Rcourse/exercise1.pdf

  

计算最大值的一种方法   网络G的重量生成树 -   由于Kruskal - 可以概括为   如下:

     
      
  1. 按重量将G的边缘按降序排序。设T为   这组边缘包括   最大重量生成树。设置T =   ∅。
  2.   
  3. 将第一条边添加到T。
  4.   
  5. 当且仅当它不在T中形成循环时,将下一个边添加到T.如果   没有剩余的边缘退出和   报告G要断开连接。
  6.   
  7. 如果T有n-1个边(其中n是G中的顶点数),则停止和   输出T.否则转到第3步。
  8.   

答案 1 :(得分:36)

来自this网站:

  

“最大生成树是具有最大权重的加权图形的生成树。可以通过否定每条边的权重并应用Kruskal算法(Pemmaraju和Skiena,2003,第336页)来计算。”

答案 2 :(得分:6)

如果您在每个边缘上反转重量并最小化,您是否获得了最大生成树?如果可行,您可以使用相同的算法。当然,零重量将是一个问题。

答案 3 :(得分:4)

虽然这个帖子太旧了,但是我还有另一种方法可以在图表中找到最大生成树(MST)G =(V,E)

我们可以应用某种Prim的算法来寻找MST。为此,我必须为最大加权边缘定义Cut Property。

剪切属性:让我们说在任何一点上我们都有一个包含MST中顶点的集合S(现在假设它以某种方式计算)。现在考虑设置S / V(顶点不在MST中):

声明:从S到S / V的具有最大权重的边缘将始终在每个MST中。

证明:假设在我们将顶点添加到集合S的时刻,从S到S / V的最大加权边是e =(u,v),其中u在S中,v在S /中V.现在考虑一个不包含e的MST。将边e添加到MST。它将在原始MST中创建一个循环。遍历循环并在S / V中找到S'和v'中的顶点u',使得u'是S中的最后一个顶点,之后我们输入S / V而v'是路径中S / V中的第一个顶点。从u循环到v。

去除边e'=(u',v')并且结果图仍然连接但是e的权重大于e'[因为e是此时从S到S / V的最大加权边缘因此,这导致MST的权重之和大于原始MST。所以这是一个矛盾。这意味着边缘e必须在每个MST中。

查找MST的算法:

Start from S={s}   //s is the start vertex
while S does not contain all vertices
 do 
 {
  for each vertex s in S
  add a vertex v from S/V such that weight of edge e=(s,v) is maximum 
  }
end while

实现: 我们可以使用Max Heap / Priority Queue来实现,其中key是从S中的顶点到S / V中的顶点的边的最大权重,value是顶点本身。在S中添加顶点等于Heap中的Extract_Max,并且在每个Extract_Max中更改刚刚添加的顶点相邻顶点的键。

因此需要进行Change_Key操作和n Extract_Max操作。

Extract_Min和Change_Key都可以在O(log n)中实现。 n是顶点数。

所以这需要O(m log n)时间。 m是图中的边数。

答案 4 :(得分:1)

否定原始图形的权重并在否定图形上计算最小生成树将给出正确的答案。原因如下:对于两个图中相同的生成树,一个图的加权和是另一个图的否定。因此,否定图的最小生成树应该给出原始树的最大生成树。

答案 5 :(得分:1)

仅反转排序顺序,并在顶点切割中选择较重的边缘并不能保证最大生成森林(Kruskal的算法生成森林,而不是树)。如果所有边缘都具有负权重,则从kruskal的反向获得的最大生成森林仍将是负权重路径。然而,理想的答案是一个断开顶点的森林。即| V |的森林单身树,或| V |总重量为0(非最不利)的成分。

答案 6 :(得分:1)

让我提供一个改进算法:

  • 首先构造一个任意树(使用BFS或DFS)
  • 然后选择树外的边缘,添加到树中,它将形成一个循环,在循环中放下最小的重量边缘。
  • 继续执行此工具,所有其余边缘都被视为

因此,我们将获得最大生成树。

这棵树满足树外的任何边缘,如果添加将形成一个循环而外边缘< =循环中的任何边权重

实际上,这是生成树成为最大生成树的必要条件。

Pf的。

必要:很明显这是必要的,或者我们可以交换边缘来制作一个边缘权重较大的树。

足够:假设树T1满足这个条件,T2是最大生成树。

然后对于边缘T1∪T2,只有T1边缘,仅T2边缘,T1∩T2边缘,如果我们向T2添加仅T1边缘(x1,xk),我们知道它将形成一个周期,我们声称,在这个周期中,必须存在一条仅有T2的边,其边缘权重与(x1,xk)相同。然后我们可以交换这些边将产生一个树,其中一条边与T2有共同点,并且具有相同的边权重之和,重复这样做我们将获得T2。所以T1也是最大生成树。

证明声明:

假设它不是真的,在循环中我们必须具有仅T2的边缘,因为T1是树。如果没有T2的边缘的值等于(x1,xk)的值,则每个仅T2边缘使用树T1进行循环,然后T1有一个循环导致矛盾。

enter image description here

该算法取自UTD教授R. Chandrasekaran的笔记。您可以在这里参考:Single Commodity Multi-terminal Flows

答案 7 :(得分:0)

以保留顺序更改权重(您可以通过将权重值取负并添加一个较大的数字来实现,其目的是确保非负数),然后在最小生成树上运行基于族吉德算法的算法。