1. 程式人生 > >演算法java實現--貪心演算法--最小生成樹問題--Prim演算法

演算法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
 */