最小生成樹是指帶權無向圖中,其各邊權值和最小的生成樹。這個問題在日常生活中會廣泛遇到,如何用最小的代價把網路中各點連線起來。
常用的演算法有kruskal,prim,我們對這兩個典型演算法進行python實現。
kruskal
kruskal演算法基於簡單連通分量的最小代價互聯。將初始圖g中各邊按權值從小到大排列成列表edges,儲存方式為 (weight, vi, vj),每次取出一條邊,檢查其連線的兩端是否已連通,若尚未連通則將該邊加入生成樹,並修改該邊所連線的兩個連通分量的狀態,否則刪除該邊。相應的python**實現如下:
1defkruskal(graph):
2 vnum = graph.vertex_num() #
得到圖中點的個數
3 mst, edges =,
4 reps = [i for i in range(vnum)] #
初始化代表元
5for vi in range(vnum): #
收集各邊
6for vj,weight in
graph.out_edges(vi):
78 edges.sort() #
將邊按權值weight從小到大排序
9for weight, vi, vj in edges: #
逐個遍歷邊,將其加入到mst中
10if reps[vi] !=reps[vj]:
1112 repi, repj =reps[i], reps[j]
13for v in range(vnum): #
更新代表元
14if reps[v] ==repj:
15 reps[v] =repi
16return mst
prim
prim演算法是基於所謂的mst準則,將圖的點集分為兩部分,mst和v,依次將邊頂點分屬於兩個點集的最小權值邊加入到生成樹中,同時將v中連線的點加入到mst中,相比於kruskal不斷將最小權值邊加入生成樹,prim則是連續擴大最小生成樹中的點集。
相應的python**實現如下:
1defprim(graph):
2 vnum =graph.vertex_num()
3 edges = prioqueue((0,0,0)) #
每次將新邊加入到乙個優先佇列中
4 mst = [none] * vnum #
用於判斷邊所連線的點是否已經遍歷過
5 edge_count =0
6while edge_count < vnum and
notedges.is_empty():
7 weight, vi, vj =edges.dequeue()
8if mst[vj] ==none:
9 edge_count += 1
10 mst[vj] =(vi, weight)
11for i,w in graph.out_edges(vj): #
將新點的出邊加入優先佇列
12if
notmst[i]:
13edges.enqueue((w, vj, i))
14return mst
Python 實現Prim最小生成樹演算法
最小生成樹 mst 對於帶權無向圖所有的生成樹中,代價最小的生成樹稱為圖的最小生成樹。prim演算法 假設n v,e 是具有n個頂點的連通圖,設u是最小生成樹中頂點的集合,設te是最小生成樹中邊的集合 初始,u te 重複執行 在所有 u u,v v u 的邊 u v 中尋找代價最小的邊 u v 並...
prim演算法 最小生成樹 python實現
prim演算法和dijkstra演算法基本思路一模一樣,都是貪婪。都是從costs邊陣列裡面找最短邊,把這個最短邊的結點加入t 已經確定好最短邊的點 中。然後再遍歷這個結點的鄰邊,更新costs。但是prim和dijkstra的區別在 呢?dijkstra的costs,costs的每個值存的是開始點...
最小生成樹prim演算法python實現
editing time 2019 7 3 20 40 file name 最小生成樹prim演算法.py from heapq import class node object pass class unionfindset object def init self,nodes self.fath...