kruskal算法java_算法java实现–贪心算法–最小生成树问题–Kruskal算法 | 学步园...

本文介绍了Kruskal算法在Java中的实现,用于解决最小生成树问题。通过FastUnionFind类处理连通分支,EdgeNode类表示边,并实现了边的比较方法。Kruskal算法核心步骤包括对边进行升序排序,使用并查集判断边连接的顶点是否在同一集合中,最后输出最小生成树的边。
摘要由CSDN通过智能技术生成

最小生成树问题(Kruskal

具体问题描述以及C/C++实现参见网址

http://blog.csdn.net/liufeng_king/article/details/8738161

import java.util.Collections;

import java.util.LinkedList;

import java.util.List;

/**

* 构造最小生成树(Kruskal算法)--贪心算法

* @author Lican

*

*/

public class KrusKal {

/**

* 由连通分支组成的集合为U,包括union(a,b);和find(v)的基本运算

* @author Administrator

*

*/

public static class FastUnionFind {

public int[] u;//数组用来保存顶点所属的集合,用数字表示

public FastUnionFind(int n){

u=new int[n+1];

for(int i=1;i<=n;i++){//初始化,起初每个顶点所属的集合名称即相应的顶点数字

u[i]=i;

}

}

public int find(int x){//找到顶点所属的集合

return u[x];

}

public void union(int x,int y){//将第二个点归入第一个点的集合(集合名字用数字表示)

u[y]=u[x];

}

}

/**

* 边的类

* @author Administrator

*

*/

public static class EdgeNode implements Comparable{

float weight;//边的权重

int u;//边的左顶点

int v;//边的右顶点

public EdgeNode(int uu,int vv,float ww){

u=uu;

v=vv;

weight=ww;

}

@Override

public int compareTo(Object x) {//升序排序(从小到大),LinkedList的first就指向长度最短的边

float xw=((EdgeNode)x).weight;

if(weight

if(xw==weight) return 0;

return 1;

}

}

/**

* Kruskal算法

* @param n 所有顶点的数目

* @param E 边的集合(所有的边)

* @param t 保存逐步连通的边

* @return 是否生成了最小生成树

*/

public static boolean kruskal(int n,LinkedList E,EdgeNode[] t){

FastUnionFind U=new FastUnionFind(n);

int k=0;

while(k

EdgeNode x=E.peek();

int a=U.find(x.u);//边的左顶点所属的集合

int b=U.find(x.v);//边的右顶点所属的集合

if(a!=b){

t[k++]=x;

U.union(a, b);

}

E.pop();

}

for(int i=0;i

System.out.println("左顶点:"+t[i].u+"; 右顶点:"+t[i].v+"; 长度:"+t[i].weight);

}

return (k==n-1);

}

public static void main(String[] args) {

int n=6;

EdgeNode e1=new EdgeNode(1,2,6);

EdgeNode e2=new EdgeNode(1,3,1);

EdgeNode e3=new EdgeNode(1,4,5);

EdgeNode e4=new EdgeNode(2,3,5);

EdgeNode e5=new EdgeNode(3,4,5);

EdgeNode e6=new EdgeNode(2,5,3);

EdgeNode e7=new EdgeNode(3,5,6);

EdgeNode e8=new EdgeNode(5,6,6);

EdgeNode e9=new EdgeNode(3,6,4);

EdgeNode e10=new EdgeNode(4,6,2);

LinkedList E=new LinkedList();

E.add(e10);

E.add(e9);

E.add(e8);

E.add(e7);

E.add(e6);

E.add(e5);

E.add(e4);

E.add(e3);

E.add(e2);

E.add(e1);

Collections.sort(E);

EdgeNode[] t=new EdgeNode[n];

kruskal(n,E,t);

}

}

/**

运行结果:

左顶点:1; 右顶点:3; 长度:1.0

左顶点:4; 右顶点:6; 长度:2.0

左顶点:2; 右顶点:5; 长度:3.0

左顶点:3; 右顶点:6; 长度:4.0

左顶点:2; 右顶点:3; 长度:5.0

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值