普利姆(Prim)算法是图的最小生成树的一种构造算法。也就是说,在包含有n个节点的连通图中,找出只有n-1条边包含有n个节点的连通子图。
问题描述:
有7个城市,现在需要修路把七个村庄连通,各个城市之间的距离用边(权值)表示。问如何修路能保证7个城市连通且总路程数最短。
注意:Prim算法用到了贪心算法的思想
此处未按照java标准来写。(属性私有,创建get,set方法供外部使用)
package com.algorithm.greedy.prim;//无向图public class MGraph { int verxs; //表示图的节点个数 char[] data; //存放节点数据 int[][] weight; //邻接矩阵,存放边 public MGraph(int verxs) { this.verxs=verxs; data=new char[verxs]; weight=new int[verxs][verxs]; } }
package com.algorithm.greedy.prim;import java.util.Arrays;//最小生成树public class MinTree { //创建图public void creatGraph(MGraph graph,int verx,char data[],int[][] weight) {for(int i=0;i 权值为"+minWeight);visit[h2]=true;minWeight=1000;}}}
package com.algorithm.greedy.prim;//普利姆算法求最短路径public class Prim {public static void main(String[] args) {char[] data=new char[] {'A','B','C','D','E','F','G'}; int verxs=data.length; //使用1000表示两个结点之间没有直接相连的路径 int[][] weight=new int[][] { {1000,5,7,1000,1000,1000,2}, {5,1000,1000,9,1000,1000,3}, {7,1000,1000,1000,8,1000,1000}, {1000,9,1000,1000,1000,4,1000}, {1000,1000,8,1000,1000,5,4}, {1000,1000,1000,4,5,1000,6}, {2,3,1000,1000,4,6,1000}, }; MGraph graph=new MGraph(verxs); MinTree mintree=new MinTree(); mintree.creatGraph(graph, verxs, data, weight); mintree.showGraph(graph); mintree.prim(graph, 1);}}