對於乙個圖,它的所有生成樹中必有乙個「邊的權值最小」的生成樹,我們把它稱為最小生成樹。
概念很抽象,換做實際問題:
有十個城市,各個城市之間距離或遠或近。需要建設乙個道路網,把十個城市連線在一起,要求道路網的道路長度最小。
各個城市的連線可以抽象為乙個圖,本質上即是求該圖的乙個最小生成樹。
每乙個圖可能有多個生成樹,但最小生成樹 所有邊的權值之和是最小的。
最小生成樹和最短路徑一樣,都是在實際中非常常見的圖演算法問題。
同樣也有專門的演算法來構造圖的最小生成樹。
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中挑選出的最小的邊,即已計算的頂點群與...