最小生成樹的Python實現

2022-07-15 05:30:15 字數 1808 閱讀 8544

最小生成樹是指帶權無向圖中,其各邊權值和最小的生成樹。這個問題在日常生活中會廣泛遇到,如何用最小的代價把網路中各點連線起來。

常用的演算法有kruskal,prim,我們對這兩個典型演算法進行python實現。

kruskal

kruskal演算法基於簡單連通分量的最小代價互聯。將初始圖g中各邊按權值從小到大排列成列表edges,儲存方式為 (weight, vi, vj),每次取出一條邊,檢查其連線的兩端是否已連通,若尚未連通則將該邊加入生成樹,並修改該邊所連線的兩個連通分量的狀態,否則刪除該邊。相應的python**實現如下:

1

defkruskal(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**實現如下:

1

defprim(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...