描述:給出乙個連通無向圖 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...