最小生成树(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值