最小生成樹(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 然後再求最小生成...