使用最小生成树算法

时间:2011-11-17 01:43:59

标签: algorithm minimum-spanning-tree

假设我有一个加权的非有向图G =(V,E)。每个顶点都有一个元素列表。

我们从顶点 root 开始,并开始查找值为 x 的元素的所有出现。我们希望以最小的距离(以边缘权重)行进,以揭示值 x 的所有元素的出现。

我想到它的方式,MST将包含所有顶点(因此所有顶点都满足我们的条件)。因此,可以通过找到从 root 到所有其他顶点的最短路径来完成发现所有出现的算法(当然,这将在MST上完成)。

编辑: 正如路易斯指出的那样,MST在所有情况下都不起作用如果根是任意选择的。但是,为了清楚起见,根是输入的一部分,因此只有一个MST可能(假设边具有不同的权重)。这个生成树确实具有从根开始到图中所有其他顶点的所有最小成本路径。

4 个答案:

答案 0 :(得分:4)

我不认为这会奏效。请考虑以下示例:

 x
 |
 3
 |
 y--3--root
 |     /
 5    3
 |   /
 |  /
  x

最小生成树包含权重为3的所有三条边,但这显然不是最佳解决方案。

如果我正确理解了问题,你想在图中找到包含标记为x的所有顶点的最小权重树。 (也就是说,正确的答案将具有总权重8,并且将是在该图中垂直绘制的两个边缘。)但是这根本不包括您任意选择的根。

我非常有信心Prim算法的以下变化可行。但不确定它是否是最佳的。

假设我们正在寻找的标签叫做L。

  1. 使用全对最短路径算法计算所有v,w的d(v,w)。
  2. 选择标记为L的节点;称之为根。 (我们可以肯定这将在结果树中,因为我们包括标记为L的所有节点。)
  3. 初始化优先级队列,并将根初始化为0.(优先级队列将包含标记为L的顶点,以及它们与树中任何节点的最小距离,包括未标记为L的顶点。)
  4. 虽然优先级队列是非空的,但请执行以下操作:
    1. 挑出队列中的顶部顶点;称它为v,它与树的距离为d。
    2. 对于从v到树的路径上的每个顶点w,包括v,找到最近的L标记节点x到w,并将x添加到优先级队列,或更新其优先级。将w添加到树中。

答案 1 :(得分:1)

答案是,如果我理解正确的话。查找最小生成树将包含所有顶点V,但您只想查找值为 x 的顶点。因此,您的MST结果可能会有不需要的顶点,从而增加额外的路径长度,因此是次优的。

答案 2 :(得分:0)

已经给出了一个示例,其中来自Root的MST M1与包含所有 x 节点但不包含Root的MST M2不同。

这是一个例子,其中Root在两个MST中:让图G包含节点R,S,T,U,V(R = Root)和顺时针路径RSTUVR,边缘权重为1,1,3,2,顺时针方向2,R,S,T,U方向 x 。第一个MST,M1,ST和VU小于R,成本6 = 2 + 4,成本3边缘TU不包括在M1中。但M2的子树S-T-U(仅)低于R,成本为5。

答案 3 :(得分:0)

否定。如果想要找到包含'x'的每个节点,从根到它的单独的路径,并最小化路径的总成本,那么你可以单独使用简单的最短路径计算每个节点从根开始,并将路径放在一起。

其中一些最短路径位于最小生成树中,因此如果这是您的目标,则MST解决方案不起作用。 MST优化了树的成本,而不是从根到节点的路径成本之和。

如果您的想法是找到从root开始的一个路径并遍历包含“x”的所有节点,那么这就是 旅行商问题 ,这是一个NP完全优化问题,即很难。