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

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

具体问题描述以及C/C++实现参见网址

http://blog.csdn.net/liufeng_king/article/details/8738161

/**
 * 最小生成树(Prim算法):贪心算法
 */
import java.util.Scanner;

public class Prim {
	public static void prim(int n,float[][] c){
		float[] lowcost=new float[n+1];
		int[] closest=new int[n+1];//表示i到其他所有未添加进来的顶点的最短距离
		boolean[] s=new boolean[n+1];//
		
		//初始化
		s[1]=true;
		for(int i=2;i<=n;i++){
			lowcost[i]=c[1][i];
			closest[i]=1;
			s[i]=false;
		}
		for(int i=1;i<n;i++){//循环n-1次
			float min=Float.MAX_VALUE;
			int j=1;
			for(int k=2;k<=n;k++){
				if(lowcost[k]!=-1&&(lowcost[k]<min)&&(!s[k])){
					min=lowcost[k];
					j=k;
				}
			}
			System.out.println(closest[j]+", "+j);
			s[j]=true;//将j添加到S中
			//逐个更改lowcost[k],如果c[j][k]<lowcost[k]则更改lowcost[k]为最小
			for(int k=2;k<=n;k++){
				if(!s[k]&&c[j][k]!=-1){
					if(c[j][k]<lowcost[k]||lowcost[k]==-1){
						lowcost[k]=c[j][k];
						closest[k]=j;
					}
				}
				
			}
		}
		
	}
	public static void main(String[] args) {
		System.out.println("请输入图顶点的个数:");
		Scanner sc = new Scanner(System.in);
		String line = sc.nextLine();
		int n = Integer.parseInt(line);
		System.out.println("请输入图的路径长度:");
		float[][] c = new float[n+1][n+1];//下标从1开始,以下都是,不连通的用-1表示
		for(int i=0;i<n;i++){
			line =  sc.nextLine();			
			String[] ds = line.split(",");
			for(int j = 0;j<ds.length;j++){
				c[i+1][j+1]=Float.parseFloat(ds[j]);
			}
		}
		System.out.println("依次构成树的边为(用两个顶点表示边):");
		prim(n,c);
	}

}
/**
 * 
 输入:
 请输入图顶点的个数:
6
请输入图的路径长度:
-1,6,1,5,-1,-1
6,-1,5,-1,3,-1
1,5,-1,5,6,4
5,-1,5,-1,-1,2
-1,3,6,-1,-1,6
-1,-1,4,2,6,-1


输出:
依次构成树的边为(用两个顶点表示边):
1, 3
3, 6
6, 4
3, 2
2, 5
 */
    原文作者:贪心算法
    原文地址: https://blog.csdn.net/lican19911221/article/details/25601247
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞