最小生成树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