克魯斯卡爾 Kruskal 演算法

2021-10-09 09:56:37 字數 3093 閱讀 4877

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

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

3、具體做法:先將各路的權值按照從小到大排序,然後建立乙個最終點的陣列。通過最終點的陣列來實現不構成迴路。

**:

// 構建最小生成樹的節點(頂點)資訊。

class

edata

// 重寫tostring,便於輸出邊上的權值

@override

public string tostring()

';}}

// 通過快速排序進行對權值的排序。

private

void

sortedge

(edata[

] edata,

int left,

int right)

if(l == r)

if(left < r)

sortedge

(edata,left,r);if

(right > l)

sortedge

(edata,l,right)

;}

// 克魯斯卡爾演算法的核心**。

for(

int i =

0; i < edgenum; i++

)

// 整體的實現步驟

public

class

kruskalalgnorithm

;int matrix[

]=,,

,,,,

,}; kruskalalgnorithm kruskalalgnorithm =

newkruskalalgnorithm

(vertexs, matrix)

; kruskalalgnorithm.

print()

;/* edata edages = kruskalalgnorithm.getedages();

system.out.println("排序前:" + arrays.tostring(edages));

// 獲取邊的數量

for(int i = 0; i < edages.length; i++)

kruskalalgnorithm.sortedge(edages,0,length-1);

system.out.println("排序後:" + arrays.tostring(edages));*/

kruskalalgnorithm.

kruskal()

;}// 構造方法

public

kruskalalgnorithm

(char

vertexs,

int[

] matrix)

// 可以使用下面的函式替代

// this.vertexs = arrays.copyof(vertexs,vertexs.length);

// 初始化邊,使用複製拷貝的方式

this

.matrix =

newint

[vlen]

[vlen]

;for

(int i =

0; i < vlen; i++)}

// 統計邊

for(

int i =

0; i < vlen; i++)}

}}public

void

kruskal()

sortedge

(edages,

0,length-1)

;// 遍歷edage陣列,將邊新增到最小生成樹中時,判斷是準備加入的邊是否形成了迴路,如果沒有,就加入rets,否則不能加入

for(

int i =

0; i < edgenum; i++)}

// 統計並列印最小生成樹,輸出rets

system.out.

println

("最小生成樹為 = "

+ arrays.

tostring

(rets));

}public

void

print()

system.out.

println()

;}}/**

* 對邊進行排序

* @param edata

*/private

void

sortedge

(edata[

] edata,

int left,

int right)

if(l == r)

if(left < r)

sortedge

(edata,left,r);if

(right > l)

sortedge

(edata,l,right);}

/** * 找尋ch對應的頂點的下標。

* @param ch

* @return

*/private

intgetposition

(char ch)

}return-1

;}/** * 功能:獲取圖中的邊放到edata 陣列中,後面我們需要遍歷該陣列

* @return

*/private edata[

]getedages()

}}return edages;

}/**

* 功能:獲取下標為i的頂點的終點(),用於後面判斷兩個頂點的終點是否相同

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

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

* @return 返回的就是 下標為i的這個頂點對應的終點的下標

*/private

intgetend

(int

ends,

int i)

return i;

}}

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條邊為止...