繼昨天的普里姆最小生成樹算法後,第二種最小生成樹算法——克魯斯卡爾算法(Kruskal)
package org.tree;
public class KruskalArithmetic {
public static void KruskalArithmetic(DataUnit[] edges,int vertexs){
int m = 0;
int n = 0;
// 定義一數組用來判斷邊與邊是否形成環路
int[] parent = new int[vertexs];
for (int i = 0; i < parent.length; i++) {
parent = 0;
}
for (int i = 0; i < edges.length; i++) {
DataUnit dataUnit = edges;
n = Find(parent, dataUnit.begin);
m = Find(parent, dataUnit.end);
//判斷是否該頂點在生成最小生成樹時產生迴路
if(n!=m){
parent[n] = m;
// 以下打出的每條邊,就是我們最小生成樹上的變
System.out.println("("+dataUnit.begin+","+dataUnit.end+") "+dataUnit.weight);
}
}
}
private static int Find(int[] parent,int f){
while(parent[f]>0){
f = parent[f];
}
return f;
}
public static void main(String[] args) {
DataUnit[] edges = new DataUnit[7];
//權值一定要由小到大,否則結果不是我要要的
edges[0] = new DataUnit(2, 3, 1);
edges[1] = new DataUnit(2, 4, 3);
edges[2] = new DataUnit(0, 1, 4);
edges[3] = new DataUnit(1, 2, 5);
edges[4] = new DataUnit(0, 2, 6);
edges[5] = new DataUnit(3, 4, 7);
edges[6] = new DataUnit(0, 4, 8);
KruskalArithmetic(edges, 5);
}
}
/**
* 此數據結構是爲了配合Kruskal算法而定義的
* @author burgess
*/
class DataUnit{
//爲了方便定義成public
public int begin; //用來存儲起始頂點
public int end; //用來存儲結束頂點
public int weight; //用來存儲權
public DataUnit(int begin, int end, int weight) {
super();
this.begin = begin;
this.end = end;
this.weight = weight;
}
//以下略
}
注意:當用Kruskal算法時,請注意所有邊的集合一定要保證權值由小到大,否則,將得不出我們要的最小生成樹答案。
網上這種算法講解很多,我僅僅在註釋上給大家略講了下。希望各位飯友學習愉快。如有錯誤,歡迎指教!!!
此算是我在書上看到的,我僅僅只是將原來的C代碼翻譯成java代碼,所以寫的原創,請勿亂噴,希望大家學習開心!!!