您的位置:首页 > 其它

最小生成树算法——克鲁斯卡尔算法

2013-01-05 20:05 253 查看
继昨天的普里姆最小生成树算法后,第二种最小生成树算法——克鲁斯卡尔算法(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[i];

n = Find(parent, dataUnit.begin);

m = Find(parent, dataUnit.end);

//判断是否该顶点在生成最小生成树时产生回路

if(n!=m){

parent
= 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算法时,请注意所有边的集合一定要保证权值由小到大,否则,将得不出我们要的最小生成树答案。

网上这种算法讲解很多,我仅仅在注释上给大家略讲了下。希望各位饭友学习愉快。如有错误,欢迎指教!!!
[/i]

[i]此算是我在书上看到的,我仅仅只是将原来的C代码翻译成java代码,所以写的原创,请勿乱喷,希望大家学习开心!!![/i]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐