最小生成樹之二 Kruskal演算法

2021-10-06 21:56:13 字數 1846 閱讀 2141

kruskal演算法主要是根據貪心演算法和並查集演算法結合實現的。

在所有邊中選擇權值最小的邊。

所選擇的邊所在的點不能是樹中的結點(不能形成迴路,根據並查集實現)

每次選擇最小的邊,直到所有的點連成樹。

整個**由三大部分組成:

1、初始化

2、排序

3、選擇加入

貪心策略不同,kruskal演算法是在所有邊中選擇最小的邊,

prim演算法是在與已經連線的結點相鄰的結點中選擇最小的邊。

prim演算法適合稠密圖,kruskal演算法適合稀疏圖

kruskal演算法形成的是最小生成樹,而並查集只是判斷結點是否在同一顆樹,並且將其連成樹。

1、如何儲存邊的關係。我採用的是結構體的方式,存放每組邊的權值以及兩個結點。

2、如果對各組邊進行從小到大的排序。採用的是在快速排序的基礎上對每組邊進行交換。

3、如何與並查集結合使用。最開始我以為對邊進行排序會影響到並查集的使用,但是後來我發現兩者沒有關係,並查集只需要對已排好序的邊進行判斷將要相連的結點是否在同乙個樹中。

#include

#include

using

namespace std;

const

int inf =

88888

;int n,m;

int a,b,c;

int map[

100]

[100];

//圖結構

int dis[

100]

;int id[

100]

;//並查集

//邊關係

typedef

struct

element1;

//初始化

void

init

(element1 element)

for(

int i =

0; i < n; i++

) id[i]

= i;

}//快速排序

intpartition

(element1 element,

int i,

int j)

while

(i < j && element[i]

.weight <= element[j]

.weight) i++;if

(i < j )

}return i;

}void

quick_sort

(element1 element,

int i,

int j)

}//並查集

//查詢根結點

intfind

(int p)

return p;

}//kruskal演算法

void

kruskal

(element1 element)

}}//輸出圖關係

void

getmap()

cout << endl;

} cout << endl;

}int

main

(int argc,

char

** ar**)

kruskal

(element);}

/* 測試用例

6 90 1 34

0 2 46

0 5 19

1 4 12

2 5 25

2 3 17

3 5 25

3 4 38

4 5 26

*/return0;

}

kruskal 最小生成樹

include include 產生隨機數組用 include 同上 include using namespace std 1 帶權邊的類myarc class myarc bool operator const myarc arc myarc myarc int beginvex,int end...

最小生成樹Kruskal

最小生成樹有兩個特點,乙個是保證了所有邊的和是最小值,另乙個是保證了所有邊中的最大值最小。struct edge bool friend operator edge a,edge b 構邊 vectoredge int id max int mini void initial void input ...

最小生成樹(kruskal)

kruskal演算法 1 記graph中有v個頂點,e個邊 2 新建圖graphnew,graphnew中擁有原圖中相同的e個頂點,但沒有邊 3 將原圖graph中所有e個邊按權值從小到大排序 4 迴圈 從權值最小的邊開始遍歷每條邊 直至圖graph中所有的節點都在同乙個連通分量中 if 這條邊連線...