克魯斯卡爾演算法,是用來求加權連通圖的最小生成樹的演算法
基本思想:按照權值從小到大的順序選擇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...