最小生成樹MST,prim和kruskal演算法

2021-10-23 17:30:24 字數 1533 閱讀 4520

描述:給出乙個連通無向圖 g=(

u,v)

g=(u,v)

g=(u,v

)和邊權重函式 w:e

→r

w:e→r

w:e→

r,希望找出它的最小生成樹,即找出乙個無環子集使得所有結點都被連線且邊權之和最短。

mst(g,w)

initialize a with empty set

while a doesn't form a mst

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

a = a union

return a

其中a是某個最小生成樹的子集,邊(u,v)對a安全意味著a並邊(u,v)仍然是某個最小生成樹的子集。

首先提出切割的定義切割

辨認安全邊的規則

簡單來說,kruskal就是把圖g中每個vertex看作是一棵樹,將所有edge按邊權從小到大排序並按順序考察每一條邊,如果該邊連線的兩個vertex不在同一棵樹上,則連線這兩個vertex。

mst-

kruskal

(g,w)

initialize a with empty set

for each vertex v in g.vertex

make-

set(v)

sort all edges in g.edge in nondecreasing order by weight w

for each edge (u,v)

if find-

set(u)

!= find-

set(v)

a = a union

union

(u,v)

return a

make-set,find-set,union的介紹詳見不相交集合的資料結構和操作

任意選擇乙個根節點,它屬於樹 a

aa ,演算法每一步中樹 a

aa 和 g−a

g - a

g−a 都構成圖 g

gg 的乙個切割,需要做的就是每次在橫跨切割的所有邊裡選擇一條輕量級邊加入樹 a

aa 。

mst-prim(g,w,root)

for each u in g.vertex

u.key = infinity

u.parent =

null

root.key =

0initialize a priority q with g.vertex

while q is not empty

u = q.

poll()

for each vertex v adjacent with u

if v.key >

w(u,v)

v.key =

w(u,v)

v.parent = u

具體實現時維護乙個key屬性,表示該結點到樹a中結點的所有邊中的邊權最小值。

最小生成樹和最大生成樹

生成樹 spanning tree 乙個連通無向圖的生成子圖,同時要求是樹。也即在圖的邊集中選擇n 1條,將所有頂點連通。最小生成樹為乙個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。最小生成樹可以用kruskal 克魯斯卡爾 演算法...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...