資料結構與演算法 克魯斯卡爾演算法 Kruskal

2021-10-09 12:50:12 字數 1428 閱讀 9284

克魯斯卡爾演算法,是用來求加權連通圖的最小生成樹的演算法

基本思想:按照權值從小到大的順序選擇n-1條邊,並保證這n-1條邊不構成迴路

具體做法:首先構造乙隻含有n個頂點的森林,然後依權值從小到大從連通網中選擇邊加入到森林中,並使森林不構成迴路,直到森林變成一棵樹為止

應用場景

**實現

public

class

krushkalcase

;int

matrix =,,

,,,,

}; krushkalcase krushkalcase =

newkrushkalcase

(vertexs, matrix)

; krushkalcase.

kruskal()

;}public

void

kruskal()

}}public

krushkalcase

(char

vertexs,

int matrix[

])//初始化邊

this

.matrix =

newint

[vlen]

[vlen]

;for

(int i =

0; i < vlen; i++)}

//統計邊

for(

int i =

0; i < vlen; i++)}

}//列印鄰接矩陣

print()

;}//列印鄰接矩陣

public

void

print()

system.out.

println()

;}}//對邊進行排序處理

private

void

sortedges

(edata[

] edges)}}

}//返回ch頂點對應的下標,找不到返回-1

private

intgetposition

(char ch)

}return-1

;}//獲取圖中的邊,放入edata陣列

private edata[

]getedges()

}}return edges;

}//獲取下標為i的頂點的終點

private

intgetend

(int ends,

int i)

return i;}}

//建立乙個類edata,它的例項物件就表示一條邊

class

edata

@override

public string tostring()

}

克魯斯卡爾演算法

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