最小生成樹問題(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
*/