最小生成树与另一个不同

时间:2015-12-27 15:23:06

标签: algorithm graph minimum-spanning-tree

假设我们得到了

无向图s,其中每个节点i,1< = i< n连接到所有j,i< j< = n

和来源s

我们希望找到最便宜的最小生成树的总成本(定义为所有边的权重之和),该最小生成树不同于s的最小距离树(即通过在(g,s)上运行prim / dijkstra至少一条边获得的MST。

解决这个问题的最佳方法是什么?因为目前,我只能想到某种定点迭代

  1. r上运行dijkstra以获取我们需要与
  2. 不同的参考图costs := sum(edge_weights_of(r))
  3. change := 0
  4. u
  5. 对于r中的每个顶点v,运行bfs并记下每个到达顶点uve = (a,b)的路径上的最长边
  6. 遍历g中的所有边e'=(a',b'):找到不在r中的newchange := weight(e') - weight(longest_edge(a',b'))并最小化newchange < 0
  7. if(first_time_here OR change += newchange),然后goto 4
  8. if(newchange&lt; 0)result := costs + change
  9. {{1}}
  10. 这似乎浪费了很多时间......它依赖于向生成树添加边缘创建一个循环,我们可以从中移除最长边。

    我还考虑过使用Kruskal来获得一个整体最小生成树,并且只使用上面的算法来替换单个边缘,当来自prim,kruskal的树都恰好相同时,但似乎没有因为结果将高度依赖于在kruskal运行期间选择的边缘。

    有任何建议/提示吗?

1 个答案:

答案 0 :(得分:2)

你可以使用Prim的算法

来做到这一点
Prim's algorithm:
let T be a single vertex x
while (T has fewer than n vertices)
{
    1.find the smallest edge connecting T to G-T
    2.add it to T
}

现在让我们修改它。

让您拥有一棵最小生成树。说树(E,V)
使用此算法

Prim's algorithm (Modified):
let T be a single vertex 
let isOther = false
while (T has fewer than n vertices)
{
    1.find the smallest edge (say e) connecting T to G-T
    2.If more than one edge is found, {
        check which one you have in E(Tree)
        choose one different from this 
        add it to T
        set isOther = true
      }
      else if one vertex is found {
        add it to T
        If E(Tree) doesn`t contain this edge, set isOther = true
        Else don`t touch isOther ( keep value ).
      }
}
If isOther = true, it means you have found another tree different from Tree(E,V) and it is T, 
Else graph have single minimum spanning tree