继昨天的普里姆最小生成树算法后,第二种最小生成树算法——克鲁斯卡尔算法(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代码,所以写的原创,请勿乱喷,希望大家学习开心!!!