Algorithm Prim';s算法改进
G=(V,E)和A⊆E 我一直在想,如果最小生成树需要包含A中的所有边(并且仍然必须具有最小权重),如何通过修改Prim的算法得到最小生成树Algorithm Prim';s算法改进,algorithm,minimum-spanning-tree,Algorithm,Minimum Spanning Tree,G=(V,E)和A⊆E 我一直在想,如果最小生成树需要包含A中的所有边(并且仍然必须具有最小权重),如何通过修改Prim的算法得到最小生成树 有人能给我一些关于如何有效修改算法的提示/想法吗?使用A中的边将阻止您获得实际的最小生成树,除非A中的边保证属于MST 但是,给定一组a,您可以找到将所有其他顶点连接到a的MST 您不能保证a中的边形成一个单独的连接组件,因此我假定它们不会 在这种情况下,使用Prim算法是一个坏主意,因为Prim算法假设在每一步,您都在有效MST和不在MST中的点之间添加
有人能给我一些关于如何有效修改算法的提示/想法吗?使用
A
中的边将阻止您获得实际的最小生成树,除非A
中的边保证属于MST
但是,给定一组a
,您可以找到将所有其他顶点连接到a
的MST
您不能保证a
中的边形成一个单独的连接组件,因此我假定它们不会
在这种情况下,使用Prim算法是一个坏主意,因为Prim算法假设在每一步,您都在有效MST和不在MST中的点之间添加一条边。由于A
形成的“MST”可能是非连续的,这打破了Prim算法的假设
相反,使用。它通过按边的长度顺序考虑边,始终首先选择最短边,将边添加到“MST集”。如果边的两端都已在MST集中,则该边将被拒绝。如果MST集中只有一条边,则新边将添加到MST集中
您可以这样实现算法:
KRUSKAL(G,A):
mst_set = ∅
for each vertex v ∈ G.V:
MAKE-SET(v)
for each edge (u,v) in A:
mst_set = mst_set ∪ {(u,v)}
UNION(u,v)
for each edge (u, v) in G.Edges ordered by weight(u, v), increasing:
if FIND-SET(u) ≠ FIND-SET(v):
mst_set = mst_set ∪ {(u, v)}
UNION(u, v)
return mst_set
其中,MAKE-SET
、UNION
和FIND-SET
操作是不相交集数据结构的一部分