數據結構筆記——最小生成樹

寫在前面:科班出身,應屆考研黨,願21考研成功上岸,沖沖衝!

目錄

知識總覽

一、生成樹

二、廣度優先生成樹

三、深度優先生成樹

四、最小生成樹(最小代價樹)

五、Prim算法(普里姆)

六、Kruskal算法(克魯斯卡爾)

七、Prim算法 vs Kruskal算法

八、Prim算法的實現思想

九、Kruskal算法的實現思想

十、總結

知識總覽

一、生成樹

連通圖生成樹包含圖中全部頂點的一個極小連通子圖。(邊儘可能的少,但要保持連通)

若圖中頂點樹爲n,則它的生成樹含有n-1條邊。對生成樹而言,若砍去它的一條邊,則會變成非連通圖,若加上一條邊則會形成一個迴路。

二、廣度優先生成樹

三、深度優先生成樹

四、最小生成樹(最小代價樹)

道路規劃要求:所有地方都連通,且成本儘可能的低

對於一個帶權連通無向圖G=(V,E),生成樹不同,每棵樹的權(即樹中所有邊上的權值之和)也可能不同。設R爲G的所有生成樹的集合,若T爲R中邊的權值之和最小的生成樹,則T成爲G的最小生成樹

①最小生成樹可能有多個,但邊的權值之和總是唯一且最小的。

②最小生成樹的邊數= 頂點樹- 1。砍掉一條則不連通,增加一條邊則會出現迴路。

③如果一個連通圖本身就是一棵樹,則其最小生成樹就是它本身

④只有連通圖纔有生成樹,非連通圖只有生成森林

五、Prim算法(普里姆)

從某一個頂點開始構建生成樹;每次將代價最小的新頂點納入生成樹,知道所有頂點的納入爲止。

六、Kruskal算法(克魯斯卡爾)

每次選擇一條權值最小的邊,使這條邊的兩頭連通(原本已經連通的就不選),直到所有結點都連通

七、Prim算法 vs Kruskal算法

Prim:

從某一個頂點開始構建生成樹;每次將代價最小的新頂點納入生成樹,知道所有頂點的納入爲止。

時間複雜度:O(|V|^2),適合用於邊稠密圖

Kruskal:

每次選擇一條權值最小的邊,使這條邊的兩頭連通(原本已經連通的就不選),直到所有結點都連通

時間複雜度:O(|E|log2|E|)適合用於邊稀疏圖

八、Prim算法的實現思想

初始:從V0開始

第1輪:循環遍歷所有個結點,找到lowCost最低的,且還沒加入樹的頂點

再次循環遍歷,更新還沒加入的各個頂點的lowCost值

第2輪:循環遍歷所有個結點,找到lowCost最低的,且還沒加入樹的頂點

第3輪:循環遍歷所有個結點,找到lowCost最低的,且還沒加入樹的頂點

第4輪:循環遍歷所有個結點,找到lowCost最低的,且還沒加入樹的頂點

第5輪:循環遍歷所有個結點,找到lowCost最低的,且還沒加入樹的頂點

九、Kruskal算法的實現思想

初始:將各條邊按權值排序

第1輪:檢查第1條邊的兩個頂點是否連通(是否屬於同一個集合),不連通,連起來

第2輪:檢查第2條邊的兩個頂點是否連通(是否屬於同一個集合)

第3輪:檢查第3條邊的兩個頂點是否連通(是否屬於同一個集合)

第4輪:檢查第4條邊的兩個頂點是否連通(是否屬於同一個集合)

第5輪:檢查第5條邊的兩個頂點是否連通(是否屬於同一個集合),已連通,跳過

第6輪:檢查第6條邊的兩個頂點是否連通(是否屬於同一個集合)

十、總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章