1.Prim演算法核心思想 prim演算法也是貪婪演算法的一個典型例子,有點類似於dijkstra演算法。核心思想:將點分為兩撥,已經加入最小產生樹的,未加入的,找到未加入中距離集合最近的點,添加該點,修改其它點到集合的距離,直到所有結點都加入到最小產生樹。
2.java原始碼
import java.util.*;public class Prim {static int MAX = Integer.MAX_VALUE;public static void main(String[] args) {int[][] map = new int[][] {{ 0, 10, MAX, MAX, MAX, 11, MAX, MAX, MAX },{ 10, 0, 18, MAX, MAX, MAX, 16, MAX, 12 },{ MAX, MAX, 0, 22, MAX, MAX, MAX, MAX, 8 },{ MAX, MAX, 22, 0, 20, MAX, MAX, 16, 21 },{ MAX, MAX, MAX, 20, 0, 26, MAX, 7, MAX },{ 11, MAX, MAX, MAX, 26, 0, 17, MAX, MAX },{ MAX, 16, MAX, MAX, MAX, 17, 0, 19, MAX },{ MAX, MAX, MAX, 16, 7, MAX, 19, 0, MAX },{ MAX, 12, 8, 21, MAX, MAX, MAX, MAX, 0 } };prim(map, map.length);} public static void prim(int[][] graph, int n){ char[] c = new char[]{'A','B','C','D','E','F','G','E','F'}; int[] lowcost = new int[n]; //到新集合的最小權 int[] mid= new int[n];//存取前驅結點 List<Character> list=new ArrayList<Character>();//用來儲存加入結點的順序 int i, j, min, minid , sum = 0; //初始化輔助數組 for(i=1;i<n;i++) { lowcost[i]=graph[0][i]; mid[i]=0; } list.add(c[0]); //一共需要加入n-1個點 for(i=1;i<n;i++) { min=MAX; minid=0; //每次找到距離集合最近的點 for(j=1;j<n;j++) { if(lowcost[j]!=0&&lowcost[j]<min) { min=lowcost[j]; minid=j; } } if(minid==0) return; list.add(c[minid]); lowcost[minid]=0; sum+=min; System.out.println(c[mid[minid]] + "到" + c[minid] + " 權值:" + min); //加入該點後,更新其它點到集合的距離 for(j=1;j<n;j++) { if(lowcost[j]!=0&&lowcost[j]>graph[minid][j]) { lowcost[j]=graph[minid][j]; mid[j]=minid; } } } System.out.println("sum:" + sum); } }