Prim--最小生成树--类Dij

package com.xjj.Ah;

import java.util.Scanner;

/*-----Prim--最小生成树--类Dij-----
 * 1. 任意从一个点出发开始构造生成树,用book[]来标记哪些点已经加入生成树
 * 	     用dis[]来记录生成树到各个顶点的距离,从dis[]中选出离生成树最近的顶点(temp),加入到生成树,
 * 	     在以temp为之间点,更新生成树到每一个非生成树顶点的距离(即dis[k]>e[temp][k])...
 * 
 * 
 * 
 * */
public class Ah_8_2 {
	private static int N;						//点数
	private static int M;						//边数
	
	public int[][] edge = new int[N+1][N+1];	//边信息数组
	public int[] dis = new int[N+1];			//距离数组
	public int[] book = new int[N+1];			//标记数组
	
	//Prim算法
	public void prim(int start){
		int count = 1,temp = 0,sum = 0;
		book[start] = 1;
		
		while(count < N){
			int min = 99999999;
			//更新点
			for(int i = 1; i <= N; i++)
				//未被标记且到生成树有最小边
				if (book[i] == 0 && dis[i] < min) {
					min = dis[i];
					temp = i;
				}
			//作为中间标记
			book[temp] = 1;
			count++;
			sum += dis[temp];
			//以该中间点作为中介
			for(int k = 1; k <= N; k++)
				if (book[k] == 0 && dis[k] > edge[temp][k])
					dis[k] = edge[temp][k];
		}
		System.out.println("最小生成树为: " + sum);
	}

	public static void main(String[] args) {
		System.out.println("输入点及边数:");
		Scanner scanner = new Scanner(System.in);
		N = scanner.nextInt();
		M = scanner.nextInt();
		Ah_8_2 ah = new Ah_8_2();
		
		//初始化
		for(int i = 1; i <= N; i++)
			for(int j = 1; j <= N; j++)
				if (i != j) {
					ah.edge[i][j] = 99999999;
				}
		//输入树
		for(int i = 1; i <= M; i++){
			int a = scanner.nextInt();
			int b = scanner.nextInt();
			int c = scanner.nextInt();
			ah.edge[a][b] = c;
			ah.edge[b][a] = c;
		}

		//对dis[]初始化
		for(int i = 1; i <= N; i++)
			ah.dis[i] = ah.edge[1][i];
		ah.prim(1);
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值