最小生成树的Prim算法和Kruskal算法java代码实现

MiniSpanTree中两个静态函数实现了最小生成树的Prim算法和Kruskal算法:

package datastucture;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 图的最小树生成算法
 * @author win7
 *
 */
public class MiniSpanTree {
	/**
	 * 求图最小生成树的PRIM算法
	 * 基本思想:假设N=(V,{E})是联通网,TE是N上的最想生成树中的变得集合。算法从U={u0}(u0属于V),
	 * TE={}开始,重复执行下述操作:在所有的u属于U,v属于V-U的边(u,v)属于E中找到一条代价最小
	 * 的边(u0,v0)并入集合TE,同事v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,{TE})
	 * 为N的最小生成树。
	 * @param  graph  图
	 * @param start 开始节点
	 * @param n     图中节点数
	 */
	public static void PRIM(int [][] graph,int start,int n){
		int [][] mins=new int [n][2];//用于保存集合U到V-U之间的最小边和它的值,mins[i][0]值表示到该节点i边的起始节点
		                             //值为-1表示没有到它的起始点,mins[i][1]值表示到该边的最小值,
		                             //mins[i][1]=0表示该节点已将在集合U中
		for(int i=0;i,权重="+minW);
			for(int j=0;j


上面代码中还需要一个边的辅助类Edge,代码如下:


package datastucture;

public class Edge implements Comparable{
	public int i,j,w;
	public Edge(int i,int j,int w){
		this.i=i;
		this.j=j;
		this.w=w;
	}
	

	@Override
	public int compareTo(Object o) {
		Edge to=(Edge)o;
		if(this.w>to.w) return 1;
		else if(this.w==to.w) return 0;
		else return -1;
		
	}
	@Override
	public String toString() {
		return "start="+i+"||end="+j+"||w="+w;
	}
}



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