prim演算法是圖論中的一種演算法,可在加權連通圖里搜尋最小生成樹。
輸入:乙個加權連通圖,頂點集合為v,邊集合為e
初始化:vnew=,其中x是v中任一節點,作為起始點,enew={}
在e中選擇權重最小的邊(u,v),其中u為集合vnew中的元素,而v則是v中沒有加入vnew的頂點(如果權重相同就任選乙個)
將v加入集合vnew中,將(u,v)加入集合enew中
重複步驟3-4,知道vnew=v
輸出:使用enew和vnew描述得到的最小生成樹
對於使用堆和鄰接表表示最小權邊和圖的情況,時間複雜度為o((
對於圖:
)# 注意:defaultdict(list)必須以list做為變數
for weight,v1, v2 in edges:
adjacent_dict[v1]
(weight, v1, v2)
) adjacent_dict[v2]
(weight, v2, v1)
)'''
經過上述操作,將圖轉化為以下鄰接表形式:
)'''
minu_tree =
# 儲存最小生成樹結果
visited =
[start]
# 儲存訪問過的頂點,注意指定起始點
adjacent_vertexs_edges = adjacent_dict[start]
heapify(adjacent_vertexs_edges)
# 轉化為小頂堆,便於找到權重最小的邊
while adjacent_vertexs_edges:
# 權重最小的邊,並同時從堆中刪除。
if v2 not
in visited:
# 在used中有第一選定的點'a',上面得到了距離a點最近的點'd',舉例是5。將'd'追加到used中
(weight, v1, v2)
)for next_edge in adjacent_dict[v2]
:# 找到v2相鄰的邊
if next_edge[2]
notin visited:
# 如果v2還未被訪問過,就加入堆中
return minu_tree
vertices =
['a'
,'b'
,'c'
,'d'
,'e'
,'f'
,'g'
]edges =[(
7,'a',
'b'),(
5,'a',
'd'),(
8,'b',
'c'),(
9,'b',
'd'),(
7,'b',
'e'),(
5,'c',
'e'),(
15,'d',
'e'),(
6,'d',
'f'),(
8,'e',
'f'),(
9,'e',
'g'),(
11,'f',
'g'),]
(prim(vertices, edges ,start=
'd')
)輸出為:
[
(5, 'd', 'a'
), (6, 'd', 'f'
), (7, 'a', 'b'
), (7, 'b', 'e'
), (5, 'e', 'c'
), (9, 'e', 'g'
)]
Prim演算法實現
include stdio.h define max vertex num 20 typedef struct arccellarccell,adjmatrix max vertex num max vertex num typedef struct mgraph struct closedge m...
Prim演算法實現
prim 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 4...
實現prim演算法
如下找出該圖的最小生成樹 prim演算法是求解該類問題的一種經典演算法 prim演算法的基本思路 將圖中的所有的頂點分為兩類 樹頂點 已經被選入生成樹的頂點 和非樹頂點 還未被選入生成樹的頂點 首先選擇任意乙個頂點加入生成樹,接下來要找出一條邊新增到生成樹,這需要列舉每乙個樹頂點到每乙個非樹頂點所有...