最小生成樹(演算法導論第23章)

2021-06-23 02:09:17 字數 1267 閱讀 5018

下面討論的兩種最小生成樹演算法都是貪心演算法。貪心演算法的每一步必須在多個可能的選擇中選擇一種,貪心演算法選擇在當前看來最好的選擇。

通用演算法是每個時刻生長最小生成樹的一條邊(安全邊),並在整個策略的實施過程中,管理乙個遵守下述迴圈不變式的邊集合a:在每遍迴圈之前,a是某棵最小生成樹的子集。

generic-mst(g,w)

a=∅while a does not form a spanning tree

find an edge(u,v) that is safe for a

a=a∪

return a

kruskal演算法:

找安全邊,在所有連線森林中兩顆不同樹的邊裡面,找到權重最小的邊(u,v)。

在該演算法中,集合a是乙個森林,其結點就是給定圖的結點,每次加入集合a中的安全邊永遠是權重最小的連線兩個不同分量的邊。我們使用乙個不相交集合(並查集)資料結構來維護幾個互不相交的元素集合。每個集合代表當前森林中的一棵樹。操作find-set(u)用來返回包含元素u的集合的代表元素。我們可以通過測試find-set(u)是否等於find-set(v)來判斷結點u和結點v是否屬於同一棵樹。使用union過程來對兩棵樹進行合併。

mst-kruskal(g,w)

a=∅for each vertex v∈g.v

make-set(v)

sort the each of g.e into nondecreasing order by weight w

for each edge(u,v)∈g.e,taken in nondecreasing order by weight

if find-set(u)≠find-set(v)

a=a∪

union(u,v)

return a

prim演算法:

該演算法中,集合a是一棵樹。每次加入到a中的安全邊永遠是連線a和a之外某個結點的邊中權重最小的邊。在演算法的執行過程中,所有不在樹a中的結點都存放在乙個基於key屬性的最小優先佇列q中。對於每個結點v,屬性v.key儲存的是連線v和樹中節點的所有邊中所有邊中最小的邊的權重。

mst-prim(g,w,r)

for each u∈g.v

u:key=∞

u:π=nil

r:key=0

q=g.v

while q≠∅

u=extract-min(q)

for each v∈g.adj[u]

if v∈q and w(u,v)

演算法導論 第23章 最小生成樹

最小生成樹 minimum spanning tree 全稱 最小權值生成樹 在含有n個頂點的連通圖中選擇n 1條邊,構成一棵極小連通子圖,並使該連通子圖中n 1條邊上權值之和達到最小,則稱其為連通網的最小生成樹。有兩種具體的實現演算法 kruskal演算法 prim演算法 兩者都用到了貪心演算法。...

《演算法導論》第23章 最小生成樹

在上圖中,就是邊cd。這兩個定理看不懂沒關係,不影響後面學習kruskal演算法與prim演算法。kruskal演算法 我的理解 1 尋找權值最小的邊,如果邊的兩個頂點屬於不同的集合就加入到a 2 重複過程1,直到找到n 1條邊 第一點中分集合的方法我借鑑了wxdjss的部落格,以下是他的部落格鏈結...

演算法導論 最小生成樹

華電北風吹 日期 2016 1 16 常用的最小生成樹演算法有prime演算法和kruskal演算法。prime演算法基於節點,kruskal基於邊。1 prime演算法 prime演算法屬於貪心演算法,與廣度優先搜尋類似。保持乙個屬於已發現的最小生成樹節點的集合。每一次從未在樹中的節點中選擇乙個與...