零
很長一段時間內,zhn_666每週會更一些之前的學過的算法,也會把曾經因爲懶惰之類的原因沒學的算法重新學一遍,這次會好好寫博客,希望有緣人看到也能學到點東西
一
這周俺要複習的算法是有關最小生成樹的
首先介紹一些關於圖的定義
- 連通圖:在一張無向圖中,任意兩點都聯通,則稱此無向圖爲連通圖
- 強連通圖:在一張有向圖中,任意兩點都聯通,則稱此有向圖爲強連通圖
- 生成樹:在有n個點連通圖中,選n-1條邊構成的連通子圖,則爲一棵生成樹。
- 最小生成樹:在生成樹中,使得這n-1條邊權值和最小,爲最小生成樹。
二
解決最小生成樹類的問題有主要兩種方法,第一種爲Kruskal算法,第二種爲prim算法
-
Kruskal 算法
此算法可以稱爲“加邊法”,初始最小生成樹邊數爲0,每次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合裏。
(1) 把圖中的所有邊按代價從小到大排序,把每個點看成一棵樹;
(2) 按權值從小到大選擇邊,所選的邊連接的兩個頂點u,v,u,v,應屬於兩顆不同的樹,則成爲最小生成樹的一條邊,並將這兩顆樹合併作爲一顆樹。(前置技能:並查集)
(3)重複(2),直到構成了一棵n-1條邊的樹。 -
prim 算法
此算法可以稱爲“加點法”,我們隨便選擇一個不在圖中的點,選擇它與這張圖能相連的最小權值的邊,直到構成一棵樹。
(1) 在一個加權連通圖中,頂點集合V,邊集合爲E
(2) 任意選出一個點作爲初始頂點,標記爲visit,計算所有與之相連接的點的距離,選擇距離最短的,標記visit.
(3) 重複以下操作,直到所有點都被標記爲visit:
三
題單(先寫一發水的,代碼日後會更新 咕咕咕警告 )