java 最小生成树

普利姆算法

	/**
	 * Prim Algorithm
	 * 		最小生成树是指能连通所有顶点的最小树
	 */
	public void prim() {
		//	最小代价权值的数组,为0表示已经获取了最小权值
		int[] lowcost=new int[vertexSize];
		//	放顶点权值的数组
		int[] adjvex=new int[vertexSize];
		
		//	存放lowcost数组中目前的最小权值
		int min;
		//	存放lowcost数组中目前最小权值的下标
		int minId;
		//	计算总权值
		int sum=0;
		
		//	初始化lowcost为第一个位置
		for(int i=1; i<vertexSize; i++) {
			lowcost[i]=matrix[0][i];
		}
		
		for(int i=1; i<vertexSize; i++) {
			min=MAX;
			minId=0;
			//	找到最小值
			for(int j=1; j<vertexSize; j++) {
				//	得到lowcost中最小值
				if(lowcost[j] != VERTEX_NONE && lowcost[j] < min) {
					min=lowcost[j];
					minId=j;
				}
			}
			System.out.println("Vertex:"+adjvex[minId]+" Value:"+min);
			//	计算权值总和
			sum+=min;				
			//	将权值对应位置的权值设为0,表示已经访问并且确定了
			lowcost[minId]=0;
			
			for(int j=1; j<vertexSize; j++) {
				//	对应位置相同的,而且权值比lowcost中小的,就进行替换
				if(lowcost[j] != VERTEX_NONE && matrix[minId][j] < lowcost[j]) {
					//	权值替换
					lowcost[j]=matrix[minId][j];
					//	顶点替换
					adjvex[j]=minId;
				}
			}
		}
		System.out.println("Total value:"+sum);
	}
	

克鲁斯卡尔算法

	/**
	 * Kruskal Algorithm    
	 */
	public void kruskal() {
		//	邻接表的长度
		int allDataSize = 0;
		//	邻接表
		Edge[] edge=new Edge[allDataSize];
		//	以起点为下标,终点为内容值的数组
		int[] parent=new int[allDataSize];
		for(int i=0; i<allDataSize; i++) {
			parent[i]=0;
		}
		int n,m,sum=0;
		for(int i=0; i<allDataSize; i++) {
			//	得到第i邻接表位置所连通的最后一个点(在parent数组中寻找)
			n=find(parent, edge[i].begin);
			//	得到第i邻接表位置连通的下一位置所连通的最后一个点(在parent数组中寻找)
			m=find(parent, edge[i].end);
			//	如果n==m则出现回环
			if(n!=m) {
				//	保存到parent数组中,表示该n位置连接到下一位置m
				parent[n]=m;
				System.out.println(edge[i].begin+","+edge[i].end);
				sum+=edge[i].weight;
			}
		}
		System.out.println("sum="+sum);
	}
	
	private int find(int[] parent,int f) {
		//	小于或等于0,则表示还没有连通
		while(parent[f]>0) {
			f=parent[f];
		}
		return f;
	}
	
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值