c語言克魯斯卡爾演算法

2021-10-11 03:52:49 字數 1762 閱讀 8256

我們用鄰接矩陣來表示該圖,克魯斯卡爾演算法思想及找到最小邊,檢視是否形成迴路,若形成迴路則這條邊不形成,若不形成迴路則構成最小路徑,以此類推。(思路和**都在下方)

建立乙個edge陣列,存放鄰接矩陣的有用資料

typedef

struct edge

int n = g->numvertices;

edge *edge =

(edge *

)malloc

(sizeof

(edge)

*(n*

(n-1)/

2));

assert

(edge !=

null);

int k =0;

//初始化edge

for(

int i=

0; i

++i)

}}

對edge中的cost排序(對圖的邊進行從小到大進行排序)

排序我們直接用stdlib.h中的qsort快速排序方法

int

cmp(

const

void

*a,const

void

*b)qsort

(edge,k,

sizeof

(edge)

,cmp)

;

3.建立father陣列用來存放父節點

father陣列用來存放各個節點的父節點,如果兩個節點的father節點相同則不形成路徑。(避免形成迴路)

int

*father =

(int*)

malloc

(sizeof

(int

)* n)

;assert

(father !=

null);

for(i=

0; i

++i)

4.克魯斯卡爾演算法核心

for

(i=0

; i++i)

}}

is_same方法解釋

bool is_same

(int

*father,

int i,

int j)

//尋找j的父節點

while

(father[j]

!= j)

//判斷i,j是否相等

return i==j;

}

mark_same方法解釋

void

mark_same

(int

*father,

int i,

int j)

//尋找j的父節點

while

(father[j]

!= j)

//將j的父節點轉化為i

father[j]

= i;

}

克魯斯卡爾演算法

測試輸入包含若干測試用例。每個測試用例的第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...