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 }