算法java实现--贪心算法--最小生成树问题--Kruskal算法

最小生成树问题(Kruskal算法)的java实现(贪心算法)

具体问题描述以及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 E,EdgeNode[] t){
		FastUnionFind U=new FastUnionFind(n);
		int k=0;
		while(k 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
*/



你可能感兴趣的:(java算法)