1 package iYou.neugle.graph; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 //创建图过程的代码在图的那篇博文中,此处直接使用 7 public class Prim { 8 private MyGraph1 graph; 9 private List<Integer> v = new ArrayList<Integer>();// 待处理集合 10 private List<Integer> u = new ArrayList<Integer>();// 已处理集合 11 12 public Prim(MyGraph1 graph) { 13 this.graph = graph; 14 } 15 16 private void Init() { 17 for (int i = 0; i < this.graph.getGraph().maxNum; i++) { 18 v.add(i); 19 } 20 } 21 22 // Prim核心方法 23 public void PrimCore() { 24 this.Init(); 25 u.add(v.get(0)); 26 v.remove(0); 27 System.out.println("最小生成树为--------"); 28 int weight = 0; 29 while (u.size() < this.graph.getGraph().maxNum) { 30 int minw = Integer.MAX_VALUE; 31 int v1 = 0, v2 = 0, r = 0; 32 for (int i = 0; i < this.u.size(); i++) { 33 int a = this.u.get(i); 34 for (int j = 0; j < this.v.size(); j++) { 35 int b = this.v.get(j); 36 int currentw = this.graph.getGraph().edge[a][b]; 37 if (currentw > 0 && currentw < minw) { 38 minw = currentw;// 权值 39 v1 = a;// 第一条边 40 v2 = b;// 第二条边 41 r = j;// 在v中待删除元素 42 } 43 } 44 } 45 System.out.println((v1 + 1) + "->" + (v2 + 1)); 46 weight += minw; 47 this.u.add(v2); 48 this.v.remove(r); 49 } 50 System.out.println("----------------"); 51 System.out.println("最小生成树的权值为: " + weight); 52 } 53 54 //主函数 55 public static void main(String[] args) { 56 MyGraph1 graph = new MyGraph1(5, 0); 57 graph.CreateMaxtrixGraph(1, 2, 2); 58 graph.CreateMaxtrixGraph(1, 3, 5); 59 graph.CreateMaxtrixGraph(1, 5, 3); 60 graph.CreateMaxtrixGraph(2, 4, 4); 61 graph.CreateMaxtrixGraph(3, 5, 5); 62 graph.CreateMaxtrixGraph(4, 5, 2); 63 graph.OutPutMaxtrixGraph(); 64 Prim prim = new Prim(graph); 65 prim.PrimCore(); 66 } 67 }
1 2 3 4 5 1 0 2 5 0 3 2 2 0 0 4 0 3 5 0 0 0 5 4 0 4 0 0 2 5 3 0 5 2 0 最小生成树为-------- 1->2 1->5 5->4 1->3 ---------------- 最小生成树的权值为: 12