最小生成樹

2021-09-12 14:36:03 字數 1043 閱讀 7473

假設要在n個城市之間建立乙個通訊聯絡網,則聯通 n 個城市只需要 n-1 條線路。這時,自然會考慮這樣乙個問題,如何在最節省經費的前提下建立這個通訊網。在每兩個城市之間都可以設定一條線路,相應的都要付出一定的經濟代價。n 個城市之間,最多可能設定 n(n - 1) / 2 條線路,那麼,如何在這些可能的線路中選擇 n - 1 條,以使總的耗費最少呢?這個問題就是構造連通網的最小代價生成樹(minimun cost spanning tree)(簡稱為最小生成樹)問題。一棵生成樹的代價就是樹上各邊的代價之和。

假設 n = (v, ) 是連通網, te 是 n 上最小生成樹中邊的集合。演算法從 u = (u。∈ v), te = 開始,重複執行下述操作:在所有 u∈u,v∈v - u 的邊(u, v)∈ e中找到一條代價最小的邊 (u。, v。)併入集合 te, 同時 v。併入u,直至 u=v 為止。此時 te 中必有 n-1 條邊,則t=(v, )為 n 的最小生成樹。

克魯斯卡爾演算法從另一途徑求網的最小生成樹。假設連通網 n=(v, ),則另最小生成樹的初始狀態為只有 n 個頂點而無邊的非連通圖 t=(v, ),圖中每個頂點自成乙個連通分量。在 e 中選擇代價最小的邊,若該邊依附的頂點落在 t 中不同的連通分量上,則將此邊加入到 t 中,否則捨去此邊而選擇下一條代價最小的邊。依此類推,直至 t 中所有頂點都在同一連通分量上為止。

普里姆演算法的時間複雜度為o(n2),與網中的邊數無關,因此適用於求邊稠密的網的最小生成樹。而克魯斯卡爾演算法恰恰相反,它的時間複雜度為o(elog(e))(e為網中邊的數目),因此它相對於普里姆演算法而言,適合於求邊稀疏的網的最小生成樹。

《資料結構(c語言版)》 嚴蔚敏 吳偉民 編著 清華大學出版社

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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...