定義:乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。
最小生成樹性質:設g=(v,e)是乙個連通網路,u是頂點集v的乙個非空真子集。若(u,v)是g中一條「乙個端點在u中(例如:u∈u),另乙個端點不在u中的邊(例如:v∈v-u),且(u,v)具有最小權值,則一定存在g的一棵最小生成樹包括此邊(u,v)。
用反證法證明mst性質:
假設g中任何一棵mst都不含輕邊(u,v)。則若t為g的任意一棵mst,那麼它不含此輕邊。
根據樹的定義,則t中必有一條從紅點u到藍點v的路徑p,且p上必有一條紫邊(u』,v』)連線紅點集和藍點集,否則u和v不連通。當把輕邊(u,v)加入樹t時,該輕邊和p必構成了乙個迴路。刪去紫邊(u』,v』)後迴路亦消除,由此可得另一生成樹t』。
t』和t的差別僅在於t』用輕邊(u,v)取代了t中權重可能更大的紫邊(u』,v』)。因為w(u,v)≤w(u』,v』),所以
w(t』)=w(t)+w(u,v)-w(u』,v』)≤w(t)
即t』是一棵比t更優的mst,所以t不是g的mst,這與假設矛盾。
普里姆(prim)演算法和克魯斯卡爾(kruskal)演算法是兩個利用mst性質構造最小生成樹的演算法。
普里姆演算法
假設n= (v,{e})是連通網,te是n上最小生成樹中邊的集合。演算法從u={u0}(u0 ∈ v),te={}開始,重複執行下述操作:在所有u∈u,v∈v-u的邊(u,v)∈e中找一條代價最小的邊(u0,v0)併入集合te,同時v0併入u,直至u=v為止。此時te中必有n-1條邊,則t=(v,{te})為n的最小生成樹。
克魯斯卡爾(kruskal)演算法
假設連通網n=(v,{e}),則令最小生成樹的初始狀態只有n個頂點而無邊的非聯通圖t=(v,{}),途中每個定點自成乙個連通分量。在e中選擇代價最小的邊,若該邊依附的定點落在t中不同的連通分量上,則將此邊加入到t中,否則捨去此邊而選擇下一條代價最小的邊。依此類推,直至t中所有定點都在同一聯通分量上為止。
int kruskal(int n, int m)
} //如果加入邊的數量小於m - 1,則表明該無向圖不連通,等價於不存在最小生成樹
if(nedge < m-1) res = -1;
return res;
}
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
最小生成樹
package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...
最小生成樹
define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...