Kruskal演算法模擬講解

2021-09-09 03:06:12 字數 2515 閱讀 1436

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...