克魯斯卡爾(Kruskal)算法詳解



將網構造為圖中右邊的邊集數組結構,並且對它們按權值從小到大排序。如:

const graph = [
  {
    begin: 4,
    end: 7,
    weight: 7,
  },
  {
    begin: 2,
    end: 8,
    weight: 8,
  },
];
注意在無向圖中,創建此結構時,每條邊的 begin 值應該比 end 小,這樣在后面查找是否形成環路的時候會更方便。

查找過程如下圖所示




概述:通過遍歷上面的邊集數據結構,從最短的邊開始查找,找到邊和頂點並記錄;繼續查找第二短的邊和頂點並記錄;以此類推;注意在找到一條邊時需要查看其兩個頂點是否都在已找到的頂點中,如果都在則需要判斷這條邊是否會形成環路,如果會形成環路則跳過此邊繼續查找;最終所有的邊遍歷完成並且沒有環路,得到最小生成樹。

查找過程詳解:

  1. 這里有9個頂點則創建一個長度為9的數組[null,null,null,null,null,null,null,null,null],數組的索引表示開始節點,值表示結束節點。這個數組是用於查找是否形成環路的重要結構。
  2. 首先我們找到最短的邊長7,頂點為4-7,那么我們就在數組中將下標為4的值改為7,表示頂點4入頂點7出。[null,null,null,null,7,null,null,null,null]
  3. 然后找到邊長8,頂點為2-8,得到頂點2入頂點8出。[null,null,8,null,7,null,null,null,null]
  4. 繼續找到邊長10,得到:[1,null,8,null,7,null,null,null,null]
  5. 繼續找到邊長11,發現邊長11的頂點為0-5,而數組中頂點0已有值,那么我們就取其值1,將數組索引1的值改為5,得到:[1,5,8,null,7,null,null,null,null]。也表示從頂點1入可以從頂點5出。
  6. 繼續找到邊長12,頂點為1-8,從索引1得到5,然后索引5改為8得到:[1,5,8,null,7,8,null,null,null]
  7. 繼續找到邊長16,有兩條,我們分別處理。1-6的,通過索引1得到5,通過索引5得到8,然后將索引8改為6得到:[1,5,8,null,7,8,null,null,6]。另一條3-7,得到:[1,5,8,7,7,8,null,null,6]
  8. 繼續找邊長17,頂點為5-6,通過索引5得到8,索引8得到6,那么我們將索引6設置為6嗎?當然不行,這樣就會得到從頂點6入又從頂點6出,自己指向自己,這就形成環路了!所以,邊長17這條線pass!
  9. 繼續找邊長19,頂點為6和7,得到:[1,5,8,7,7,8,7,null,6]
  10. 繼續查找,就發現所有的線都會形成環路。最后,上面找到的頂點和線就是最終結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM