一、Prim算法
普利姆(Prim)算法適用於求解無向圖中的最小生成樹(Minimum Cost Spanning Tree)。下面是Prim算法構造最小生成樹的過程圖解。
選擇一個節點開始,比如V1進入集合U,剩下的集合的V-U包括剩下的節點,然后尋找從集合U到集合V-U最近的路徑。這里有三條路徑分別是權重為6到V2,權重為5到V4以及權重為1到V3,顯然到通過V3連接而集合U和集合V-U是最近的,選擇V3進入集合U。同樣繼續選擇到V-U的路徑,此時有6條可選路徑,分別是權為6到V2【從V1】,權為5到V4【從V1】,權為5到V2【從V3】,權為5到V4【從V3】,權為6到V5【從V3】,權為4到V6【從V3】。選擇出從V3到V6的路徑並將V6添加至集合U中。按照這種方法依次將V4,V2和V5添加到集合U直到U和全體節點結合V相等,或者說V-U集合為空時結束,這時選出的n-1條邊即為最小生成樹。
二、Kruskal算法
克魯斯卡爾(Kruskal)算法是另一種求解最小生成樹的算法。下面是Kruskal算法構造最小生成樹的過程圖解。
Kruskal則是采取另一種思路,即從邊入手。首先n個頂點分別視為n個連通分量,然后選擇一條權重最小的邊,如果邊的兩端分屬於兩個連通分量,就把這個邊加入集合E,否則舍去這條邊而選擇下一條代價最小的邊,依次類推,直到所有節點都在同一個連通分量上。
三、對比
假設網中有n個節點和e條邊,普利姆算法的時間復雜度是O(n^2),克魯斯卡爾算法的時間復雜度是O(eloge),可以看出前者與網中的邊數無關,而后者相反。因此,普利姆算法適用於邊稠密的網絡而克魯斯卡爾算法適用於求解邊稀疏的網。