最小生成樹 Prime演算法

2021-07-04 11:08:02 字數 2275 閱讀 9089

對於乙個圖,它的所有生成樹中必有乙個「邊的權值最小」的生成樹,我們把它稱為最小生成樹。

概念很抽象,換做實際問題:

有十個城市,各個城市之間距離或遠或近。需要建設乙個道路網,把十個城市連線在一起,要求道路網的道路長度最小。

各個城市的連線可以抽象為乙個圖,本質上即是求該圖的乙個最小生成樹。

每乙個圖可能有多個生成樹,但最小生成樹 所有邊的權值之和是最小的。

最小生成樹和最短路徑一樣,都是在實際中非常常見的圖演算法問題。

同樣也有專門的演算法來構造圖的最小生成樹。

prime演算法是求解最小生成樹問題最常用的演算法,思想和上次講解的 最短路徑dijkstra演算法 有些接近。

1.     把所有節點分成兩類,一類是已經加入到了 當前的生成樹中(集合 y) ,一類是還沒有加入當前的生成樹中(集合n)。

ps:  1. 顯然,這種分類可以用flag來設定。

2. 最終的生成樹是一步一步構造的,所以說是 「當前的」生成樹。

2.     從 y 中取得乙個節點 vy, 從 n 中取得乙個節點 vn. 使其滿足 vy和vn之間邊的權值最小。

3、 找到滿足上述條件的節點後,把vn結點從 n 移入 y中。

ps: 具體**實現是,flag值修改即可。 (最原始的做法,後續會有改進方式)

3.     重複上述 2. 3. 兩步,直到所有節點全部加入y中。

**實現時需要注意的幾個問題:

1.     如何表示集合y 和集合 n

當然,可以使用乙個flag陣列表示,比如為true表示在y中,false在n中。

2.     集合y和集合n中均可能有多個節點,如何從n集合中找到符合條件(距離y中所有節點最近)的結點?

最粗暴的方法,每次都分別遍歷 y 和 n集合,兩重遍歷可以找到n中的該結點,但是效率會很差。可以從資料結構設計的角度改善。

建立乙個陣列, int mindis[ n ]

對於其中元素 mindis[i],其含義是 j 節點到 y 集合所有節點距離的最小值。

尋找n中符合條件的結點時,只需要遍歷n集合中結點mindis的資料,找到最小值即可。

顯然,對於y集合中的結點 i ,mindis[i]都是 0.

這樣,mindis陣列也可以替代上步中的flag陣列: mindis值是0,即代表結點在y集合中。

3.     每次從n集合中找到符合條件的結點 i 後,都需要做哪些處理?

首先,要把它從n移動到y中。 mindis[i] = 0 即可。(原因參考上步的說明)

其次,要判斷是否需要更新n中剩餘結點 minddis的值。

因為mindis[j] 儲存的是j結點到y中所有結點距離的最小值,當把i結點從n移動到y中後,y集合元素增多,對於n中剩餘結點j而言,mindis[j]的值可能會減小。

什麼情況下該值會減小?

當從n移動到y中的結點 i 距離 j結點的值 小於 當前 mindis[j]的值,就需要更新mindis.

#define n 100

int matrix[n][n];

//最小生成樹資訊

int treelenthresult = 0; //最終生成的最小生成樹 邊的權值之和

int mindis[n];

int closevertex[n];

//設定起始結點下標是0 (從頂點0開始構造)

//初始化mindis

for (int i = 0; i < n; i++)

//起始結點初始化

mindis[0] = 0;

closevertel[0] = 0;

//n-1次遍歷,每次都從集合n中找到乙個結點,距離集合y中所有結點值最小

for (int i = 1; i < n; i++)

}if (tmploc != -1)

//tmploc結點從n結合移至y集合

mindis[tmploc] = 0;

//更新n集合中剩餘的其他結點

for (int j = 0; j < n; j++) }}

最小生成樹 prime演算法

問題 c 建立通訊 時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 4 提交 狀態 討論版 題目描述 據不完全統計,受 影響,四川大部分災區通訊陷入癱瘓,數千個基站因斷電 傳輸中斷等原因退出服務,目前總公司已緊急部署對受災地區進行通訊搶修。按照應急通訊保障預案,必須盡快 付出代價最小...

最小生成樹 prime演算法

生成樹頂點集合,初始只含起點 v0。visit i 1 i點已在生成樹中 lowcost i 生成樹中的點 到頂點 i 的最短距離。演算法過程 1.初始化生成樹,一開始只將起點 v0 加入到 樹中。2.初始化 lowcost 陣列,初值為 v0 到各頂點的距離,無邊則為 inf。重複以下步驟,直到所...

prime演算法 最小生成樹

若有差錯,望請指正!最小生成樹prime演算法,時間複雜度o v 2 時間複雜度只與頂點個數有關,與邊無關 gedge define max 1000 可以更大 void mintree prime graph g int min arc 從min weight中挑選出的最小的邊,即已計算的頂點群與...