最小生成树算法——克鲁斯卡尔算法
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]
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]
相关文章推荐
- 图(最小生成树的两中算法——普里姆算法和克鲁斯卡尔算法)
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- 最小生成树(普利姆算法、克鲁斯卡尔算法) .
- 算法复习 - 最小生成树算法 Prim、Kruskal(普里姆算法、 克鲁斯卡尔算法)
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】
- (转)最小生成树之普利姆算法、克鲁斯卡尔算法
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- 无向网图的最小生成树算法--克鲁斯卡尔算法
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- [Sicily 1090 Highways] 求最小生成树的两种算法(普里姆算法/克鲁斯卡尔算法)
- hdu 1233(还是畅通工程)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
- 最小生成树(普利姆算法、克鲁斯卡尔算法) .
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】
- 最小生成树(普利姆算法、克鲁斯卡尔算法)(逻辑理解小结)
- 最小生成树(普利姆算法、克鲁斯卡尔算法)