克魯斯卡爾(kruskal)演算法 十大演算法

2021-10-04 15:43:51 字數 1972 閱讀 5677

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

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

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

1、某城市新增7個站點(a, b, c, d, e, f, g) ,現在需要修路把7個站點連通

2、各個站點的距離用邊線表示(權) ,比如 a – b 距離 12公里

3、問:如何修路保證各個站點都能連通,並且總的修建公路總里程最短?

1、先把邊的按權值進行排序,得[2,3,4,5,6,7,8,9,10,12,14,16]

2、之後從小到大找出每條邊,判斷該邊是否產生迴路,如果不產生迴路,則滿足條件,加入到結果中

3、重複步驟2,直到判定完所有邊

public

class

kruskal

;int matrix[

]=,,

,,,,

};kruskal kruskal =

newkruskal

(vertexs, matrix)

; kruskal.

print()

; kruskal.

kruskal()

;}public

kruskal

(char

vertexs,

int[

] matrix)

// 初始化邊

this

.matrix =

newint

[vlen]

[vlen]

;for

(int i =

0; i < vlen; i++)}

// 統計邊

for(

int i =

0; i < vlen; i++)}

}}// 列印

public

void

print()

system.out.

println()

;}}// 排序邊

public

void

sortedges

(edata[

] edges)}}

}/**

* @param ch 頂點的值

* @return 頂點的下標

*/public

intgetposition

(char ch)

}return-1

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

** @return

*/public edata[

]getedges()

}}return edges;

}/**

* 判斷兩個頂點的終點是否相同

** @param ends 陣列就是記錄另各個頂點對應的終點是哪個,陣列是遍歷過程中逐步形成

* @param i 表示傳入的頂點對應的下標

* @return 下標為i的這個頂點對應的終點

*/public

intgetend

(int

ends,

int i)

return i;

}public

void

kruskal()

} system.out.

println

("最小生成樹");

for(

int i =

0; i < index; i++)}

}class

edata

@override

public string tostring()

';}}

kruskal克魯斯卡爾演算法

給定乙個帶權的無向連通圖,如何選取一棵生成樹,使樹上所有邊上權的總和為最小,這叫最小生成樹.求最小生成樹的演算法 1 克魯斯卡爾演算法 圖的存貯結構採用 邊集陣列 且權值相等的邊在陣列中排列次序可以是任意的.該方法對於邊相對比較多的不是很實用,浪費時間 方法 將圖中邊按其權值由小到大的次序順序選取,...

克魯斯卡爾演算法 Kruskal

克魯斯卡爾 kruskal 演算法是一種按權值的遞增次序選擇合適的邊來構造最小生成樹的方法。假設g v,e 是乙個具有 n 個頂點的帶權連通圖,t u,t e 是g 的最小生成樹,則構造最小生成樹的步驟如下 1 設定 u的初值等於 v 即包含有 g中的全部頂點 te 的初值為空集 即圖 t 中每乙個...

克魯斯卡爾 Kruskal 演算法

設g v,e 是具有n個頂點的連通網,t u,te 是其最小生成樹。初值 u v,te 對g中的邊按權值大小從小到大依次選取。選取權值最小的邊 vi,vj 若邊 vi,vj 加入到te後形成迴路,則捨棄該邊 邊 vi,vj 否則,將該邊併入到te中,即te te 重複 直到te中包含有n 1條邊為止...