Prim和Kruskal的不同之處在於兩者選擇的變數不同,Prim選擇的是始終保持權值最小,然後逐個加點構建一棵樹。而Kruskal則是始終保證是一棵樹(雖然構建過程中不一定是真正的樹,但並查集判環可以這樣理解:是為了保證結果是一顆樹),然後逐條加邊,使權值最小。

知道上述兩種思想後,來談談程式碼的(都是基於貪心)實現:

Prim:(這裡把權值理解成距離)假設,已經確定的點的集合為S,那麼還未確定的點可以記為1-S,我們每次從還未確定的點集合1-S中,選擇一個裡離集合S中的點直接相連,且權值最小(貪心)的點加入S中,不妨被這個點為t,則S與1-S將發生變化:由於t變成了S中的點,那麼1-S中與t相連的點的距離實際上變成了該點與S的距離。由於初始化時,已經有一個點已經標誌,那麼只需要迴圈N-1次就夠了,而且只能是N-1次,否則可能會發生錯誤(視INF而定),這就是Prim演算法。

Kruskal:這個演算法相對於Prim來說就比較好理解多了,每次選擇權值最小的(貪心)的邊,然後看看該邊的兩個點是否與樹矛盾(用並查集判斷就行了),在加邊的過程中記錄有效點的數目,達到N個就結束,不用把每條邊都考慮進去。

中尋找的是下一個與MST中任意頂點相距最近的頂點;
Dijkstra演算法尋找的是下一個離給定頂點(單源)最近的頂點。
另外,當有兩條具有同樣的最小權值的邊可供選擇時,任選一條即可,所以構造的MST不是惟一的。
Prim演算法和Dijkstra演算法十分相似,惟一的區別是:
Prim演算法要尋找的是離已加入頂點距離最近的頂點;
Dijkstra演算法是尋找離固定頂點距離最近的頂點。
所以Prim演算法的時間複雜度分析與Dijkstra演算法相同,都是 O(|V^2|)