prim演算法 最小生成樹 python實現

2021-09-01 15:54:07 字數 1894 閱讀 2951

prim演算法和dijkstra演算法基本思路一模一樣,都是貪婪。都是從costs邊陣列裡面找最短邊,把這個最短邊的結點加入t(已經確定好最短邊的點)中。然後再遍歷這個結點的鄰邊,更新costs。

但是prim和dijkstra的區別在**呢?

dijkstra的costs,costs的每個值存的是開始點到該點的路徑權值總和

而prim的costs,costs的每個值存的是該點到該點父結點的邊權,只有一條邊的權值,不像dijkstra那樣把之前走過的路徑加上。

最後生成的生成樹也不一樣,dijkstra生成的是單源最短路徑生成樹,就是乙個點到其他點的路徑樹,一般應用於運輸;prim生成的是總路徑最短生成樹,就是這種樹既把所有點連在一起,而且該樹的總權值最小,一般應用於建造鋪設。

後面的更新costs的時候,判斷條件不一樣。dijkstra在結點裡面找邊的時候,邊權值加上該結點小於之前的costs就更新;而prim找邊的時候,直接用邊權值和之前的costs比,小於就更新。

python**

# 最小生成樹python實現

def prim(graph):

n = len(graph)

costs = [99999 for _ in range(n)] # 父結點到該結點的邊權值

costs[0] = 0

parents = [-1 for _ in range(n)]

visited = [false for _ in range(n)]

t =

while len(t) < n:

# 在costs找最短邊,把該最短邊的結點加入t,標記為已訪問

mincost = 99999

minnode = none

for i in range(n):

if not visited[i] and costs[i] < mincost:

mincost = costs[i]

minnode = i

visited[minnode] = true

# 遍歷該結點的邊,更新最短邊

for edge in graph[minnode]:

if not visited[edge[0]] and edge[1] < costs[edge[0]]:

costs[edge[0]] = edge[1]

parents[edge[0]] = minnode

return costs, parents

data = [

[2, 0, 1],

[2, 1, 5],

[2, 3, 5],

[2, 4, 5],

[2, 5, 4],

[0, 1, 6],

[0, 3, 5],

[4, 1, 3],

[4, 5, 6],

[5, 3, 2],

]# 構造鄰接表

n = 6

graph = [ for _ in range(n)]

for edge in data:

# 最小生成樹mst

print('mst')

costs, parents = prim(graph)

print('costs:', costs)

print('parents', parents)

total = 0

for cost in costs:

total += cost

print('total cost of mst:', total)

# 執行結果

# mst

# costs: [0, 5, 1, 2, 3, 4]

# parents [-1, 2, 0, 5, 1, 2]

# total cost of mst: 15

最小生成樹(prim演算法)

最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...

最小生成樹 Prim演算法

prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...

最小生成樹 prim 演算法

一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...