最小生成樹有兩個經典算法:Prim算法和Kruskal算法,Prim適合于點較少的圖,對于一個節點數為N的連通圖來說,其時間復雜度為O(N^2);Kruskal適合于邊較少的圖,對一個邊為E的連通圖來說,其時間復雜度為O(ElogE),因此要根據不同情況選擇合適的算法。
這里說一下Prim算法。
Prim的具體步驟為把所有點分為兩個部分:屬于集合S,或不屬于S,當所有點都屬于S時,算法結束。
1.初始條件先將第一個點p0劃到S中,然后利用p0關聯的所有邊更新cost[](sost[i]表示pi與S中點相連的最短的那條邊長)
2.每次從sost[]中選出最小的那一個cost[i](i不能屬于S),將i加入到S中,并利用與i相關的邊更新cost[](已加入到S中的點不用再更新)
3.反復執行第二步,直到圖連通。(我們知道一個有n個節點的圖,最少只需要n-1條邊就可以連通了,所以第二步會執行n-1次,每次都會在圖中加入一條邊)
關于Kruskal請參閱:http://www.shnenglu.com/hoolee/archive/2012/08/04/186253.html
下面是zoj1203的Prim算法代碼:
這里說一下Prim算法。
Prim的具體步驟為把所有點分為兩個部分:屬于集合S,或不屬于S,當所有點都屬于S時,算法結束。
1.初始條件先將第一個點p0劃到S中,然后利用p0關聯的所有邊更新cost[](sost[i]表示pi與S中點相連的最短的那條邊長)
2.每次從sost[]中選出最小的那一個cost[i](i不能屬于S),將i加入到S中,并利用與i相關的邊更新cost[](已加入到S中的點不用再更新)
3.反復執行第二步,直到圖連通。(我們知道一個有n個節點的圖,最少只需要n-1條邊就可以連通了,所以第二步會執行n-1次,每次都會在圖中加入一條邊)
關于Kruskal請參閱:http://www.shnenglu.com/hoolee/archive/2012/08/04/186253.html
下面是zoj1203的Prim算法代碼:
