克魯斯卡爾演算法

2021-09-03 02:14:09 字數 1555 閱讀 3874

克魯斯卡爾演算法也是用來尋找乙個圖的最小生成樹的演算法,與prim演算法相同的是,二者都採用由小及大的策略,逐步將整個圖的最小生成樹求出,但二者不同的地方在於prim演算法逐步歸併頂點,而克魯斯卡爾演算法則是逐步歸併邊。

演算法思想:

設聯通網路n =

(1)構造乙個只有n個頂點,沒有邊的非連通圖t= ,每個頂點獨自成乙個連通分量;

(2)在e中選最小權值的邊,若該邊的兩個頂點落在不同的聯通的分量上,則加入t中;否則捨去,重新選擇;

(3)重複下去,直到所有的頂點在通乙個連通分量上為止。

我們還是用圖來解釋一下這些蒼白的語言描述吧:

話不多說我們上**:

1.資料結構實現及相關的小函式:

#include

#include

#include

#include

#include

#include

#define n 100

#define initfite 32767

using namespace std;

typedef

struct nodegraph;

struct nnodeedge[n]

;int

cmp(

const

void

*a,const

void

*b)//cmp函式,用於qsort排序函式;

intlocate

(graph g,

char ch)

2.建圖:

void

create_graph

(graph &g)

}

3.克魯斯卡爾演算法:

void

clus

(graph g)

int k =0;

for(

int i =

0;i < g.arcnum;i++)}

}}

4.主函式:

int

main()

clus

(g);

return0;

/*a b 6

a c 3

b d 1

b e 3

c d 2

c e 9

d e 7*/

/*a b 6

a c 1

a d 5

b c 5

b e 3

c e 6

c f 4

c d 5

d f 2

e f 6*/

}

例題及執行結果:

克魯斯卡爾演算法原則上要求會手工操作,但是會寫**更棒喔!!!

克魯斯卡爾演算法

測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 n 村莊數目m 100 隨後的 n 行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本 也是正整數 為簡單起見,村莊從1到m編號。當n為0時,全部輸入結束,相應的結果不要輸出。對每個測試用例,在...

克魯斯卡爾演算法

設n v,是連通網 1 令最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖t v,圖中每個頂點自成乙個連通分量 2 在e中選擇代價最小的邊,若該邊依附的頂點落在t中不同的連通分量上,則將此邊加入到t中,否則捨去此邊而選擇下一條代價最小的邊 3 反覆執行第2 步,直至t中所有頂點都在同一連通分量上為...

克魯斯卡爾演算法

via 克魯斯卡爾演算法 在連通網中求出最小生成樹 include include define maxedge 20 define maxvex 20 define infinity 65535 typedef struct mgraph typedef struct edge 對邊集陣列edge...