假设我们得到了
无向图s
,其中每个节点i,1< = i< n连接到所有j,i< j< = n
和来源s
。
我们希望找到最便宜的最小生成树的总成本(定义为所有边的权重之和),该最小生成树不同于s
的最小距离树(即通过在(g,s)
上运行prim / dijkstra至少一条边获得的MST。
解决这个问题的最佳方法是什么?因为目前,我只能想到某种定点迭代
r
上运行dijkstra以获取我们需要与costs := sum(edge_weights_of(r))
change := 0
u
r
中的每个顶点v
,运行bfs并记下每个到达顶点u
从v
到e = (a,b)
的路径上的最长边g
中的所有边e'=(a',b')
:找到不在r
中的newchange := weight(e') - weight(longest_edge(a',b'))
并最小化newchange < 0
change += newchange
),然后goto 4
result := costs + change
这似乎浪费了很多时间......它依赖于向生成树添加边缘创建一个循环,我们可以从中移除最长边。
我还考虑过使用Kruskal来获得一个整体最小生成树,并且只使用上面的算法来替换单个边缘,当来自prim,kruskal的树都恰好相同时,但似乎没有因为结果将高度依赖于在kruskal运行期间选择的边缘。
有任何建议/提示吗?
答案 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