普里姆算法--最小生成树

代码如下:

public class Prim {

	public static void main(String[] args){
		int vertexNumber =9;
		int[][] arr = new int[vertexNumber][vertexNumber];
		for (int i = 0; i < vertexNumber; i++) {  
            for (int j = 0; j < vertexNumber; j++) {  
                if (i == j) {  
                    arr[i][j] = 0;  
                } else {    
                    arr[i][j] = 65535;  
                }  
            }
		}
		arr[0][1] = 10;  
        arr[0][5] = 11;  
        arr[1][0] = 10;  
        arr[1][2] = 18;  
        arr[1][6] = 16;  
        arr[1][8] = 12;  
        arr[2][1] = 18;  
        arr[2][3] = 22;  
        arr[2][8] = 8;  
        arr[3][2] = 22;  
        arr[3][8] = 21;  
        arr[3][6] = 24;  
        arr[3][7] = 16;  
        arr[3][4] = 20;  
        arr[4][3] = 20;  
        arr[4][7] = 7;  
        arr[4][5] = 26;  
        arr[5][0] = 11;  
        arr[5][6] = 17;  
        arr[5][4] = 26;  
        arr[6][1] = 16;  
        arr[6][5] = 17;  
        arr[6][3] = 24;  
        arr[6][7] = 19;  
        arr[7][6] = 19;  
        arr[7][3] = 16;  
        arr[7][4] = 7;  
        arr[8][1] = 12;  
        arr[8][2] = 8;  
        arr[8][3] = 21;
        System.out.println("最小生成树为:");
        minSpanTree_Prim(arr);
	}
	
	public static void minSpanTree_Prim(int[][] arr){
		int min,j,k;
		int count =0;
		int[] adjvex = new int[arr.length];  //保存相关顶点下标
		int[] lowcast = new int[arr.length]; //保存相关点间边的权值
		lowcast[0] = 0;    //初始化第一个权值为0,即v0加入生成树
		                   //lowcast的值为0,在这里就是此下标的顶点已经加入生成树
		adjvex[0] =0;      //初始化第一个顶点下标为0
		for(int i=1;i<arr.length;i++){ //循环除下标为0的全部顶点
			lowcast[i] = arr[0][i];  //将v0顶点与之有边的权值存入数组
			adjvex[i] =0;            //初始化都为v0的下标
		}
		
		for(int i=1;i<arr.length;i++){
			min = 65535;   //初始化最小权值为65535
			j=1;k=0;
			while(j<arr.length){    //循环全部顶点
				if(lowcast[j]!=0&&lowcast[j]<min){ //如果权值不为零且权值小于min
					min = lowcast[j]; //则让当前权值成为最小值
					k=j;  //则将当前最小的下标存入k
				}
				j++;
			}
			count+=lowcast[k];
			System.out.println(adjvex[k]+"  "+k+"  "+count);//打印当前顶点边中权值最小边			
			lowcast[k] =0;//将当前顶点的权值置为0,表示此顶点已经完成任务
			for(j =1;j<arr.length;j++){
				if(lowcast[j]!=0&&arr[k][j]<lowcast[j]){
					//若下标为k顶点各边权值小于此前这些顶点未被加入生成树权值
					lowcast[j]=arr[k][j];  //将较小权值存入lowcast
					adjvex[j]=k;  //将下标为k的顶点存入adjvex
				}
			}
		}
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值