prim算法_跟我一起学算法之Prim算法

什么是Prim算法?

普利姆(Prim)算法是图的最小生成树的一种构造算法。也就是说,在包含有n个节点的连通图中,找出只有n-1条边包含有n个节点的连通子图。

画图模拟Prim算法构造最小生成树的过程

问题描述:

有7个城市,现在需要修路把七个村庄连通,各个城市之间的距离用边(权值)表示。问如何修路能保证7个城市连通且总路程数最短。

0cf1923f4ae2fd00394288970bdd5256.png

连通图

b3dd607ce144e7bf088be9d0ef8c08f5.png

使用Prim算法构造最小生成树过程

Prim算法思想

  1. 找一个顶点v开始构造最小生成树,从顶点v的邻接矩阵中找到权值最小的那条边,以及对应的顶点u。将v和u加入到visit集合中
  2. 连接v-u。从顶点v和u这两个顶点的邻接矩阵中寻找权值最小的那条边,以及对应的顶点w。将w加入到visit集合中。
  3. 依次类推,直到连接所有的顶点

注意: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);}}
64cc1bfcd39a0e0b6b891a5bd7e480c4.png

运行结果展示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值