1. 程式人生 > >【數據結構】 最小生成樹(二)——kruskal算法

【數據結構】 最小生成樹(二)——kruskal算法

適用於 相同 inf prim 什麽 一段 大樹 集合 n-1

  上一期說完了什麽是最小生成樹,這一期咱們來介紹求最小生成樹的算法:kruskal算法,適用於稀疏圖,也就是同樣個數的節點,邊越少就越快,到了數據結構與算法這個階段了,做題靠的就是速度快,時間復雜度小。

  網上一搜就知道大家都會先介紹prim算法,而我為什麽不介紹prim算法呢?因為小編認為這個算法理解快,也很容易明白,可以先做個鋪墊(小編絕不會告訴你小編是因為不會才不說的),kruskal算法核心思想是將一棵棵樹林(也可以理解成子樹)合並成一棵大樹,具體做法如下:將一個連通圖中不停尋找最短的邊,如果不與已經在集合中的邊形成回路就把這條邊放入最小生成樹的集合中,如果形成就不理他了唄,這樣反復下去就OK了,下面是一段演示過程:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

  這條邊發生了回路,就不要了。

技術分享圖片

到此時已有5條邊進入集合了,共有6個頂點此時已大功告成,就要結束循環,不必再尋找了。

下面是一段偽代碼:

//假設MST[]是最小生成樹的集合,cnt表示是存入集合的邊數 
while(cnt<n-1)//共有n-1條邊
{
    在圖中找出最短的一條邊;
    if(添加這條邊不產生回路) 
    {
        加入MST集合;
        cnt++; 
    } 
} 

  找出圖中最短邊自然是容易的,實在不行直接暴力過一遍,無疑,是否產生回路是一個重難點,此時就要用到並查集了(不會並查集的點這裏傳送門),這裏要使用路徑壓縮,只要祖先相同就能判斷在同一集合中,如果不在同一集合則合並,否則就不用這條邊了,直到湊夠n-1條邊為止。

  這一期講述了kruskal算法,下一期將會介紹prim算法,欲知後事如何,且聽下回分解。

【數據結構】 最小生成樹(二)——kruskal算法