kruskal 演算法是乙個求最小生成樹的演算法,即求最小的開銷等
演算法可以這樣,要求得最小生成樹,那麼n個節點只能包括n-1條邊
所以我們應該轉換為尋找這最短的n-1條邊,因此,可以先對所有的
邊進行從小到大排序,每次取出一條邊來進行試探,看是否夠成環,
如果不構成環,那麼肯定是最短的路徑了,因為每次都是取最小
的邊來試探,最終可以求得最小的生成樹代價和。
/*
filename:kruskal.cpp
author: xiaobing
e-mail: [email protected]
date: 2013-08-31
*/#include#include#include#include#include#include#include#include#define n 100
#define inf 1000000
using namespace std;
/* kruskal 演算法是乙個求最小生成樹的演算法,即求最小的開銷等
演算法可以這樣,要求得最小生成樹,那麼n個節點只能包括n-1條邊
所以我們應該轉換為尋找這最短的n-1條邊,因此,可以先對所有的
邊進行從小到大排序,每次取出一條邊來進行試探,看是否夠成環,
如果不構成環,那麼肯定是最短的路徑了,因為每次都是取最小
的邊來試探,最終可以求得最小的生成樹代價和。
用到的資料結構:
struct edge 表示一條邊,包括兩個端點及其代價
edge graph[n] 表示有n條邊組成的圖
int father[n] 表示每個點的最上層的根節點
解釋:因為這裡需要判斷是否形成環路,可以這樣,每新增一條
邊,看兩個點是否在已經新增進去的邊的點集中,若對需要新增
的這條邊,發現兩個點都在之前的那個集合中,這一定會形成回
路,所以,這裡設定乙個陣列father[n],起初時,每個值為-1,代
表每個點的根節點都沒有(因為沒有新增一條邊進去),當新增一條
邊後,如果他們的根節點不同,則設定大的那個點的父節點為小
的那個點,如x > y 則 father[x] = y,這樣每個點都只有乙個根,
或者沒有根,為-1,所以對新增進的節點,都可以查出他的根,然後
做比較,都相同,說明已位於新增進的節點中了,否則把該邊新增
進去。*/
//定義一條邊
struct edge;
//這是乙個對塊數排序演算法呼叫的乙個比較函式
bool cmp(const edge &a, const edge &b)
//查詢乙個節點的根節點
int findfather(int father, int x)
//若為-1,則該點就是根
return x;
}//新增一條邊
bool unionedge(int father, int x, int y)
//若不同,讓大的節點的根節點指向小的節點
if(x > y) father[x] = y;
if(x < y) father[y] = x;
//該邊可以加入,返回true
return true;
}int main() else
k++;
continue;
}//由於是對稱的,該值無用,但得接收
cin>>temp;
} //將所有邊從小到大排序
sort(graph, graph + k, cmp);
//列印排序後的邊
for(i = 0;i < k;i++){
cout<"<
測試例子:
70 5 -1 -1 -1 11 2
5 0 10 8 -1 -1 13
-1 10 0 7 -1 -1 -1
-1 8 7 0 12 9 4
-1 -1 -1 12 0 10 -1
11 -1 -1 9 10 0 3
2 13 -1 4 -1 3 0
結果:
0 6->0: 2
1 6->5: 3
2 6->3: 4
3 1->0: 5
4 3->2: 7
5 3->1: 8
6 5->3: 9
7 2->1: 10
8 5->4: 10
9 5->0: 11
10 4->3: 12
11 6->1: 13
12 2->0: 1000000
13 6->4: 1000000
14 6->2: 1000000
15 3->0: 1000000
16 5->2: 1000000
17 5->1: 1000000
18 4->2: 1000000
19 4->1: 1000000
20 4->0: 1000000
最小生成樹代價和sum : 31
Prim演算法 Kruskal演算法
一 prim演算法 1 要求 1 生成一顆連通的樹 2 生成樹 包含全部頂點,v 1條邊,沒有迴路,並且新增一條邊會變成有迴路 3 權重和最小 2 過程模擬 最重要 貪心的思想,每一步都要選擇權值最小的,這棵樹所有跟頂點相連的邊中最小的。從根節點開始,讓樹慢慢的長大。過程 從v1開始 跟v1有聯絡的...
Prim演算法 Kruskal演算法
prim演算法 kruskal演算法 prim演算法和kruskal演算法,都是用來找出圖中最小生成樹的演算法,兩個演算法有些小差別。prim演算法 又稱普里姆演算法,以圖上的頂點為出發點,逐次選擇到最小生成樹頂點集距離最短的頂點為最小生成樹的頂點,並加入到該頂點集,直到包含所有的頂點。1.選擇一出...
Kruskal演算法 Prim演算法
最小生成樹是什麼?自a2392008643的部落格 此演算法可以稱為 加邊法 初始最小生成樹邊數為0,每迭代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合裡。把圖中的所有邊按代價從小到大排序 把圖中的n個頂點看成獨立的n棵樹組成的森林 按權值從小到 擇邊,所選的邊連線的兩個頂點ui,v...