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