Python 實現Prim最小生成樹演算法

2021-08-21 23:50:45 字數 2253 閱讀 4337

最小生成樹(mst):對於帶權無向圖所有的生成樹中,代價最小的生成樹稱為圖的最小生成樹。

prim演算法:假設n=(v,e) 是具有n個頂點的連通圖,設u是最小生成樹中頂點的集合,設te是最小生成樹中邊的集合;

初始,u = ,te = ,

重複執行: 在所有 u∈u,v∈v-u 的邊 ( u , v ) 中尋找代價最小的邊( u』 , v』 ) ,並納入集合 te 中;

同時將 v』 納入集合 u 中;

直至 u = v 為止。

prim演算法也是典型的貪心演算法。最小生成樹的主要有兩個重複過程:尋找乙個滿足條件的未插入到生成樹集合的結點;利用該結點更新其餘頂點到生成樹集合的最小權值資訊。因此,時間複雜度o(,其中n為圖的結點。

如下圖

prim演算法過程:初始u=,v-u=     te={}

u=,v-u=      +(a,b)

u=,v-u=      +(a,f)

u=,v-u=      +(b,i) 

u=,v-u=      +(i,c) 

u=,v-u=      +(b,g)

u=,v-u=      +(g,e)

u=,v-u=      +(g,h)

u=,v-u={}     +(h,d)

**實現

import sys

if __name__=='__main__':

max = sys.maxsize

primgraph = [[max, 10, max, max, max, 11, max, max, max],

[10, max, 18, max, max, max, 16, max, 12],

[max, 18, max, 22, max, max, max, max, 8],

[max, max, 22, max, 20, max, max, 16, 21],

[max, max, max, 20, max, 26, 7, 19, max],

[11, max, max, max, 26, max, 17, max, max],

[max, 16, max, max, 7, 17, max, 19, max],

[max, max, max, 16, 19, max, 19, max, max],

[max, 12, 8, 21, max, max, max, max, max]]

chararray = ['a','b','c','d','e','f','g','h','i']

charlist =

mid = #mid[i]表示生成樹集合中與點i最近的點的編號

lowcost = #lowcost[i]表示生成樹集合中與點i最近的點構成的邊最小權值 ,-1表示i已經在生成樹集合中

n = len(chararray)

for i in range(1,n): #初始化mid陣列和lowcost陣列

sum = 0

for _ in range(1,n): #插入n-1個結點

minid = 0

min = max

for j in range(1,n): #尋找每次插入生成樹的權值最小的結點

if(lowcost[j]!=-1 and lowcost[j]primgraph[minid][j]):

lowcost[j] = primgraph[minid][j]

mid[j] = minid

print("sum="+str(sum))

print("插入結點順序:"+str(charlist))

執行結果

a——b權值:10

a——f權值:11

b——i權值:12

i——c權值:8

b——g權值:16

g——e權值:7

g——h權值:19

h——d權值:16

sum=99

插入結點順序:['a', 'b', 'f', 'i', 'c', 'g', 'e', 'h', 'd']

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

最小生成樹prim演算法實現

今天從志權師兄那裡學會了最小生成樹。所謂生成樹,就是n個點之間連成n 1條邊的圖形。而最小生成樹,就是權值 兩點間直線的值 之和的最小值。首先,要用二維陣列記錄點和權值。如上圖所示無向圖 int map 7 7 map 1 2 map 2 1 4 map 1 3 map 3 1 2 然後再求最小生成...