Java實現Prim算法
1 package com.java; 2 import java.util.*; 3 4 /** 5 * 普里姆算法—Prim算法 6 * 算法思路:將圖中所有的頂點分為兩類:樹頂點(已被選入生成樹的頂點)和非樹頂點(還未被選入生成樹的頂點)。 7 * 1)首先選擇任意一個頂點加入生成樹; 8 * 2)接下來要找出一條邊添加到生成樹,這需要枚舉每一個樹頂點到每一個非樹頂點所有的邊,然后找到最短邊加入到生成樹; 9 * 3)按照此方法重復n-1次,直到將所有頂點都加入到生成樹中。 10 */ 11 12 public class Prim { 13 static int MAX = Integer.MAX_VALUE; 14 15 public static void main(String[] args) { 16 int[][] map = new int[][] { 17 { 0, 2, 14, 1}, 18 { 2, 0, 5, MAX}, 19 { 14, 5, 0, 8}, 20 { 1, MAX, 8, 0}}; 21 prim(map, map.length); 22 } 23 public static void prim(int[][] graph, int n){ 24 25 char[] c = new char[]{'A','B','C','D'}; 26 int[] lowcost = new int[n]; //到新集合的最小權 27 int[] mid= new int[n];//存取前驅結點的下標 28 List<Character> list=new ArrayList<Character>();//用來存儲加入到生成樹結點 29 int i, j, min, minid , sum = 0; 30 //初始化輔助數組 31 for(i=1;i<n;i++) 32 { 33 lowcost[i]=graph[0][i]; 34 mid[i]=0; 35 } 36 //加入第一個根節點 37 list.add(c[0]); 38 //加入其他的n-1個節點 39 for(i=1;i<n;i++) 40 { 41 min=MAX; 42 minid=0; 43 //每次找到距離集合最近的點 44 for(j=1;j<n;j++) 45 { 46 if(lowcost[j]!=0&&lowcost[j]<min) 47 { 48 min=lowcost[j]; 49 minid=j; 50 } 51 } 52 if(minid==0) return; 53 //將找到的最小值的節點加入到生成樹 54 list.add(c[minid]); 55 //加入生成樹后的節點值設為0 56 lowcost[minid]=0; 57 sum+=min; 58 System.out.println(c[mid[minid]] + "到" + c[minid] + " 權值:" + min); 59 //加入該點后,更新其它點到集合的距離 60 for(j=1;j<n;j++) 61 { 62 if(lowcost[j]!=0&&lowcost[j]>graph[minid][j]) 63 { 64 lowcost[j]=graph[minid][j]; 65 mid[j]=minid; 66 } 67 } 68 } 69 System.out.println("最小生成樹的權值為sum=" + sum); 70 71 } 72 }