寫在前面:科班出身,應屆考研黨,願21考研成功上岸,沖沖衝!
目錄
知識總覽
一、生成樹
連通圖的生成樹是包含圖中全部頂點的一個極小連通子圖。(邊儘可能的少,但要保持連通)
若圖中頂點樹爲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條邊的兩個頂點是否連通(是否屬於同一個集合)