背景:
無向連通圖G=(V,E)的最小生成樹算法:
1.prim算法:
(1)初始頂點集合S爲空,把任意一個頂點s加入集合S.
(2)迭代|V|-1次,每次加入頂點u,使得v屬於S,u不屬於S並且(u,v)權值最小, 記錄邊(u,v)
(3)所有記錄過的邊(u,v)即最小生成樹
2.kruskal算法:
(1)把有|E|中邊按權值非降排序
(2)邊初始集合S爲空,每次加入權值最小的邊,當加入後邊集合不構成迴路,刪掉此邊。迴路判定可以採取並查集方法
(3)邊集合爲最小生成樹
題意:求n個村莊的最小生成樹,1<n<27,n個村莊用前n個大寫字母表示。輸入n和 n-1個頂點與之連通的頂點和權值。輸入最小生成樹邊權值和。邊權值小於100,邊集合|E|小於等於75,一個頂點連接的邊數小於等於15.
分析:prim算法對於處理稠密鄰接矩陣有效,而kruskal對於邊稀疏矩陣有效。這道題應該kruskal更有效一些。不過兩個算法在Judge上運行都是Memory 228K, 時間爲0MS,不知道那些Memory<30K是怎麼優化的。
源碼: