Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Prim';s算法改进_Algorithm_Minimum Spanning Tree - Fatal编程技术网

Algorithm Prim';s算法改进

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中的点之间添加

G=(V,E)和A⊆E 我一直在想,如果最小生成树需要包含A中的所有边(并且仍然必须具有最小权重),如何通过修改Prim的算法得到最小生成树


有人能给我一些关于如何有效修改算法的提示/想法吗?

使用
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
操作是不相交集数据结构的一部分