最小生成树(kruskal算法,prim算法)

最小生成树MST的定义是:对于有权重的可连通的图,图的顶点个数为n,尝试找出(n-1)条边,这些边的端点的集合包括了图的所有顶点,而且所有边的权重之和最小,找到的路径就是最小生成树。

下面用伪代码写出 kruskal & prim 算法

prim 算法

从一个点开始(cost变为1),其他点未被激活的cost为无穷,然后从起始点开始,这些点组成一个优先队列PrioQueue(key=cost),接下来对这个队列一个个减:
寻找邻边权重最小的边,令边的另一个端点cost为边的权重,pres为之前的点,然后开始寻找下一个

A=vide                     #A={edges} set of edges in MST
for all v∈V:
    cost(v)=\infinty 
    prev(v)=null
Pick initial node v_0
cost(v_0)=0

Queue=makequeue(V)         #priority queue={all vertices}, using cost as key)
while Queue is not empty:
      v=delete_min(Que)    # For 1st, the first vertex is v_0 with cost 0
      if prev(v)!=null:
           A=A+edge(v,prev(v))  # add an edge
      for each (v,z)∈E:    # adjacency points of v
           if z∈Q and cost(z)>w(v,z):  # if cost(point)>edge_weight
                cost(z)=w(v,z)
                prev(z)=v
return  A

kruskal 算法

思路:按权重,将边排序,从权重小的开始,遇到回路(新的 边的两端顶点都已经visited,则舍弃这条边,进行下一条边),这里采用的技术是:每个顶点定义一个集合,每个集合有一个标签

def Union(x,y):
    set(x).add(y)
 def Find(x):
     return repre(set)

A=vide                     #A={edges} set of edges in MST
for each v in V:
    makeset(V)                           # the repre[v]=v

sort the edges in E (with increasing weight w)=>PrioQueue 
for each edge(u,v)in PrioQueue:
   if Find(u) != Find(v):
        A=A+edge(u,v)
return  A

你可能感兴趣的:(数据结构)