演算法java實現--貪心演算法--最小生成樹問題--Prim演算法
阿新 • • 發佈:2019-02-01
最小生成樹問題(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 */