最小生成樹:
最小生成樹(Minimum Spanning Tree,MST)是在一個給定的無向圖G(V,E)中求一棵樹T,使得這棵樹擁有圖G中的所有頂點,且所有邊都是來自圖G中的邊,並且滿足整棵樹的邊權之和最小。

圖10-43給出了一個圖G及其最小生成樹T,其中較粗的線即為最小生成樹的邊。可以看到,邊AB、BC、BD包含了圖G的所有頂點,且由它們生成的樹的邊權之和為6,是所有生成樹中權值最小的(例如邊AD、BD、CD生成的樹,其邊權之和為7,大於之前給出的樹的邊權之和)。
最小生成樹有3個性質需要掌握:
①最小生成樹是樹,因此其邊數等於頂點數減1,且樹內一定不會有環。
②對給定的圖G(V,E),其最小生成樹可以不唯一,但其邊權之和一定是唯一的。
③由於最小生成樹是在無向圖上生成的,因此其根結點可以是這棵樹上的任意一個結點。於是,如果題目中涉及最小生成樹本身的輸出,為了讓最小生成樹唯一,一般都會直接給出根結點,讀者只需以給出的結點作為根結點來求解最小生成樹即可。
求解最小生成樹一般有兩種算法,即prim算法與kruskal算法。
這兩個算法都是采用了貪心法的思想,只是貪心的策略不太一樣。
Prim算法與Kurskal算法比較
(1)從算法的思想可以看出,如果圖G中的邊數較小時,可以采用Kruskal算法,因為Kruskal 算法每次查找最短的邊;邊數較多可以用Prim算法,因為它是每次加一個結點。
可見,Kruskal算法適用於稀疏圖,而Prim算法適用於稠密圖。
(2)從時間上講,Prim算法的時間復雜度為O(n2),Kruskal 算法的時間復雜度為O(eloge)。
(3)從空間上講,顯然在Prim算法中,只需要很小的空間就可以完成算法,因為每一次都是從V-U集合出發進行掃描的,只掃描與當前結點集到U集合的最小邊。但在Kruskal算法中,需要對所有的邊進行排序,對於大型圖而言,Kruskal算法需要占用比Prim算法大得多的空間。
