一.什么是Prim算法

 普里姆算法查找最小生成树的过程,采用了贪心算法的思想。对于包含 N 个顶点的连通网,普里姆算法每次从连通网中找出一个权值最小的边,这样的操作重复 N-1 次,由 N-1 条权值最小的边组成的生成树就是最小生成树。

二.Prim实现的思路

  1. 将连通网中的所有顶点分为两类(假设为 A 类(结点已访问)和 B 类(结点未访问)。  初  始状态下,所有顶点位于 B 类;
  2. 选择任意一个顶点,将其从 B 类移动到 A 类;  (把这个结点标志为访问了)
  3. 从 B 类的所有顶点出发,找出一条连接着 A 类中的某个顶点且权值最小的边,将此边连接着的 A 类中的顶点移动到 B 类(双重循环 ,找出访问节点和未访问结点之间最小的边)
  4. 重复执行第 3  步,直至 B 类中的所有顶点全部移动到 A 类,恰好可以找到 N-1 条边。     (循环实现 构成N-1次)

假如从顶点A出发,顶点 B、C、D 到顶点 A 的权值分别为 2、4、2,所以,对于顶点 A 来说,顶点 B 和顶点 D 到 A 的权值最小,假设先找到的顶点 B:

继续分析顶点 C 和 D,顶点 C 到 B 的权值为 3,到 A 的权值为 4;顶点 D 到 A 的权值为 2,到 B 的权值为无穷大(如果之间没有直接通路,设定权值为无穷大)。所以顶点 D 到 A 的权值最小:
最后,只剩下顶点 C,到 A 的权值为 4,到 B 的权值和到 D 的权值一样大,为 3。所以该连通图有两个最小生成树:

三. Prim应用举例及代码实现

问题描述:有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通
     * 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里。
     * 求:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?

实现思路

例如从A点开始,普利姆算法步骤如下:
        1.从<A>顶点开始处理,A-C [7] A-G[2] A-B[5] ,选择最小的<A,G> ,并将两点标记为已选择
       2. <A,G> 开始 , 将A 和 G 顶点和他们相邻的还没有访问的顶点进行处理 A-C[7] A-B[5]  G-B[3]             G-E[4] G-F[6]    选择最小的<A,G,B>,并标记为已选择
        3. <A,G,B> 开始,将A,G,B 顶点 和他们相邻的还没有访问的顶点进行处理 A-C[7] G-E[4] G-              F[6] B-D[9]       选择最小的<A,G,B,E>,并标记为已选择。以此类推,最后会得到:
        4.{A,G,B,E}->F//第4次大循环 ,  对应 边<E,F> 权值:5
       5.{A,G,B,E,F}->D//第5次大循环 , 对应 边<F,D> 权值:4
        6. {A,G,B,E,F,D}->C//第6次大循环 , 对应 边<A,C> 权值:7 ===> <A,G,B,E,F,D,C>

代码实现 

package c13prim;import java.util.Arrays;public class Prim {//用一个大数表示两个点之间走不通,没有连接public  static  final int N = 100;public static void main(String[] args) {char[] vertexs = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G'};//使用数组表示邻接矩阵, N表示不连通int[][] weight = new int[][]{{N, 5, 7, N, N, N, 2},{5, N, N, 9, N, N, 3},{7, N, N, N, 8, N, N},{N, 9, N, N, N, 4, N},{N, N, 8, N, N, 5, 4},{N, N, N, 4, 5, N, 6},{2, 3, N, N, 4, 6, N}};Graph graph = new Graph(vertexs, weight);System.out.println("图的存储信息");graph.showGraph();System.out.println("选择修建的连接边的信息");graph.prim(0);}static class Graph{private char[] vertex;  //表示顶点信息private int[][] edges;   //存放邻接矩阵 ,表示边之间的权值public Graph(char[] vertex,int[][] edges) {this.vertex =vertex;this.edges = edges;}public void showGraph(){for (int[] edge : edges) {System.out.println(Arrays.toString(edge));}}//构建Prim算法,根据思路实现代码public void prim( int VertexIndex) {//标记顶点是否已经被选中,选中为1,没选中为0int[] selected = new int[vertex.length];//把当前顶点标记为已选中selected[VertexIndex] = 1;//已经访问顶点的下标int visitYesIndex = -1;//还没有访问顶点的下标int visitNoIndex = -1;//初始化最小权值为一个不可达的数int minWright = N;int length=vertex.length;//为什么从1开始?因为普利姆算法结束后,k个顶点,生成的边只能是k-1个for (int k = 1; k < length; k++) {//每次都需要遍历已经选择的顶点,比如第一次遍历只有A点是已选择的,第二次有A,G,第三次有A,G,B,第四次......for (int i = 0; i < length; i++) {//每次都需要遍历还没有被选择的顶点,比如当i 对应的为A时,j对应的有C,G,B(排除不可达的顶点)for (int j = 0; j < length; j++) {//如果i是已选择的j是未选择的且i和j之间是可达(存在边)的if (selected[i] == 1 && selected[j] == 0 && edges[i][j] < minWright) {//替换 minWeight ,寻找已经访问的顶点和没有访问的顶点的权值的最小边minWright = edges[i][j];// 替换每次比较符合条件的已选择顶点和未选择顶点visitYesIndex = i;visitNoIndex = j;}}}//一次循环之后  得到了最小一条边,此时要把没访问的置为已访问了System.out.println("选择边 <" + vertex[visitYesIndex] + "," +vertex[visitNoIndex] + "> 权值:" + minWright);selected[visitNoIndex] = 1;//minWright 重新设置最大值minWright = N;}}}}

结果展示

Prim算法解决最小生成树 (解决修路问题)相关推荐

  1. 1分钟解决Prim算法构造最小生成树

    数据结构期末上分必备 前言:Prim 算法构造最小生成树!!!跟着画一遍就会了!!! Kruskal 请移步 kruskal 题目 设有如下图所示的无向连通图,从顶点A出发,使用 Prim 算法构造最 ...

  2. 三十七、Prim算法--求解最小生成树

    一.Prim算法介绍 普利姆(Prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶点的 连通子图,也就是所谓的极小连通子图 普利姆的算法如下: 设 ...

  3. prim算法 求最小生成树

    最小生成树Prim算法理解 标签: Prim算法理解最小生成树Prim 2014-08-16 18:49 18482人阅读 评论(5) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  4. 小黑算法成长日记18:基于Prim算法的最小生成树

    import math nodes = ['A','B','C','D','E','F'] # 结点数组 vecs = [[0,1,6],[0,2,1],[0,3,5],[1,0,6],[1,2,5] ...

  5. Prim算法实现最小生成树

    Prim算法实现最小生成树 1.最小生成树是什么 2.最小生成树的用途 3.Prim算法描述 4.Prim算法演示最小生成树过程 5.Prim算法实现 END 1.最小生成树是什么 对连通图进行遍历, ...

  6. 数据结构与算法-Prim算法解析与解决修路最小生成树问题

    文章目录 简介 Prim算法 最小生成树 应用场景 问题描述 思路分析 代码实现 简介 Prim算法 ​ 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索 ...

  7. 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)

    最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...

  8. prim算法_最小生成树(Kruskal和Prim算法)

    文章和资源同步更新至微信公众号:算法工程师之路 8月份会开启每日算法题系列,值得期待哦 上一篇文章,我们讲了图的创建和遍历,其中遍历的算法主要有BFS(广度优先算法)和DFS(深度优先算法)两种,并且 ...

  9. Prim算法实现最小生成树(Java)

    最小生成树包含n个顶点和(n-1)条边,并且边的权重最小.Prim算法的思想是:由一颗小树慢慢长大,首先分为两个顶点集合,最小生成树的顶点集合A,和不在生成树中的顶点集合B,每次从B中找一个顶点v,使 ...

  10. Prim算法求最小生成树

    一.Prim算法 prim算法是用来求最小生成树的问题具体就是在一个图的n个节点找到n-1条边,使这n-1条边的权值最小 二.修路问题 在狗熊岭有如下七个村庄 村庄道路连接情况和距离如图所示 现在需要 ...

最新文章

  1. Eclipse Tomcat的一些基本配置
  2. 算法笔记之回溯法(2)
  3. IOS 学习笔记 2015-03-24 OC-API-常用结构体
  4. Linux下SVN服务器的搭建
  5. ❤『面试知识集锦100篇』3.mysql篇丨mysql基础知识和面试真题,看完不收藏算我输!!
  6. 代码注释: (文字图案:HIRE)
  7. QWT6.0.1+win7下安装说明
  8. 别再找Axure XX版,这款原型工具永久免费!
  9. 《word精彩实例互动教程》已经上线!
  10. 在XP上安装VS2003及注意事项
  11. 想你的风还是吹到了长沙
  12. Express全系列教程之(六):cookie的使用
  13. 一文讲透小石头Little Stone:Web3时代Gravatar、中国版BAYC、平台NFT、社区门票
  14. LOJ10144宠物收养所
  15. 初步研究iphone充电方案及充电协议(一)
  16. Android中蓝牙的基本使用----BluetoothAdapter类简介
  17. Redisson分布式锁的配置和使用
  18. unity 动态字体 和 静态字体
  19. knockout学习笔记
  20. 超细节的javaWeb知识点总结

热门文章

  1. NOI2010超级钢琴
  2. 逐飞与龙邱英飞凌miniwiggler仿真器硬件接口适配与差异总结
  3. 软件系统的标准化和产品化
  4. c语言中MAXINE,13岁高定设计师二度亮相北京时装周 Maxine WangGrace Chen高定系列发布...
  5. java 山洞过火车 java,我的世界稀有PE种子:罕见双层末地门!
  6. dsf5.0 有确认按钮的弹框
  7. Excel图表7——漏斗图
  8. 笔记:A Novel Representation of Parts for Accurate 3D Object Detection and Tracking in Monocular Images
  9. 盛世昊通:广州车展那些出彩的车,你心动了吗?
  10. 介绍一下我大二开发的游戏:地下城冒险