一、Prim算法介绍

  Prim(普利姆)算法是一种构造最小生成树的算法。Prim算法的时间复杂度为O(∣V∣2)O(|V|^2)O(∣V∣2),不依赖于EEE,因此它适用于求解边稠密的图的最小生成树。

二、Prim算法原理

  (1)初始时从图中任取一顶点加入最小生成树MinTree顶点集合中。
  (2)选择一个与当前MinTree中顶点集合距离最近的顶点,并将该顶点和相应的边加入MinTree中,每次操作后MinTree中的顶点数和边数都增1。
  (3)重复(2)步骤,直到所有顶点都加入到MinTree中,得到最小生成树。此时MinTree中有n−1n-1n−1条边。

三、Prim算法图解


  构造图(a)的最小生成树过程如下:
  (1)从顶点V1V_{1}V1​开始,离V1V_{1}V1​最近的三个顶点为V2、V3、V4V_{2}、V_{3}、V_{4}V2​、V3​、V4​,选取权值最小的顶点V3V_{3}V3​,加入顶点集合中,并将边<V1,V3V_{1},V_{3}V1​,V3​>加入最小生成树中。(如图b所示)
  (2)此时顶点集合为(V1,V3V_{1},V_{3}V1​,V3​),离顶点集合中最近的顶点为V2、V4、V5、V6V_{2}、V_{4}、V_{5}、V_{6}V2​、V4​、V5​、V6​,选取权值最小的顶点V6V_{6}V6​,加入顶点集合中,并将边<V3,V6V_{3},V_{6}V3​,V6​>加入最小生成树中。(如图c所示)
  (3)此时顶点集合为(V1,V3,V6V_{1},V_{3},V_{6}V1​,V3​,V6​),离顶点集合中最近的顶点为V2、V4、V5V_{2}、V_{4}、V_{5}V2​、V4​、V5​,选取权值最小的顶点V4V_{4}V4​,加入顶点集合中,并将边<V6,V4V_{6},V_{4}V6​,V4​>加入最小生成树中。(如图d所示)
  (3)此时顶点集合为(V1,V3,V6、V4V_{1},V_{3},V_{6}、V_{4}V1​,V3​,V6​、V4​),离顶点集合中最近的顶点为V2、V5V_{2}、V_{5}V2​、V5​,选取权值最小的顶点V2V_{2}V2​,加入顶点集合中,并将边<V3,V2V_{3},V_{2}V3​,V2​>加入最小生成树中。(如图e所示)
  (4)此时顶点集合为(V1,V3,V6、V4、V2V_{1},V_{3},V_{6}、V_{4}、V_{2}V1​,V3​,V6​、V4​、V2​),离顶点集合中最近的顶点为V5V_{5}V5​,选取权值最小的顶点V5V_{5}V5​,加入顶点集合中,并将边<V2,V5V_{2},V_{5}V2​,V5​>加入最小生成树中。(如图f所示)
  (5)此时顶点集合为(V1,V3,V6、V4,V2、V5V_{1},V_{3},V_{6}、V_{4},V_{2}、V_{5}V1​,V3​,V6​、V4​,V2​、V5​),所有顶点已加入到集合中。最小生成树的边为<V1,V3V_{1},V_{3}V1​,V3​>、<V3,V6V_{3},V_{6}V3​,V6​>、<V6,V4V_{6},V_{4}V6​,V4​>、<V3,V2V_{3},V_{2}V3​,V2​>、<V2,V5V_{2},V_{5}V2​,V5​>。

四、Prim算法代码实现

package com.haiyang.algorithm.prim;/*** @author haiYang* @create 2022-02-01 16:57*/
public class PrimAlgorithm {public static void main(String[] args) {char[] data = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G'};int vertexs = data.length;//maxValue表示两个顶点之前没有边int maxValue = Integer.MAX_VALUE;//邻接矩阵的关系使用二维数组表示,maxValue表示两个点不联通int[][] weight = new int[][]{{maxValue, 5, 7, maxValue, maxValue, maxValue, 2},{5, maxValue, maxValue, 9, maxValue, maxValue, 3},{7, maxValue, maxValue, maxValue, 8, maxValue, maxValue},{maxValue, 9, maxValue, maxValue, maxValue, 4, maxValue},{maxValue, maxValue, 8, maxValue, maxValue, 5, 4},{maxValue, maxValue, maxValue, 4, 5, maxValue, 6},{2, 3, maxValue, maxValue, 4, 6, maxValue}};Graph graph = new Graph(vertexs, data, weight);prim(graph, 0);}/*** @param graph 图* @param v     开始顶点*/public static void prim(Graph graph, int v) {//标记已访问顶点int[] visited = new int[graph.vertexs];//将开始顶点标记已访问visited[v] = 1;//h1、h2标记最小的权值weight位置int h1 = -1;int h2 = -1;//记录最小权值int minWeight = Integer.MAX_VALUE;//除开始顶点,将其他graph.verrtexs-1个顶点进行选取for (int k = 1; k < graph.vertexs; k++) {//遍历图的所有情况,找到此轮的最小权值连接的顶点for (int i = 0; i < graph.vertexs; i++) {for (int j = 0; j < graph.vertexs; j++) {//选取的顶点要求:i是已经选取的的顶点,j是为选取的顶点,找到满足情况的最小权值,记录位置if (visited[i] == 1 && visited[j] == 0 && graph.weight[i][j] < minWeight) {minWeight = graph.weight[i][j];h1 = i;h2 = j;}}}//将此轮选取的最小权值连接的顶点信息输出System.out.println("边<" + graph.data[h1] + "," + graph.data[h2] + "> 权值=" + minWeight);//将此轮选取的顶点标记为已访问visited[h2] = 1;//重新初始化minWeight值minWeight = Integer.MAX_VALUE;}}
}/*** 图类*/
class Graph {int vertexs; //表示顶点个数char[] data;//存放顶点数据int[][] weight; //使用邻接矩阵存放边public Graph(int vertexs, char[] data, int[][] weight) {this.vertexs = vertexs;this.data = data;this.weight = weight;}
}

Prim算法(java)相关推荐

  1. 最小生成树Prim算法Java版

    最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...

  2. 最小生成树Prim算法java实现

    package prim;import java.util.*;public class PrimTest {public static void main(String[] args) {//交互输 ...

  3. Prim算法java实现

    原理简单介绍: 1).输入:一个加权连通图,其中顶点集合为V,边集合为E: 2).初始化:Vertex数组,Vertex作为定点,包含其索引,父节点索引,其与已构建的最小生成树中存在的边中最小权值we ...

  4. 最小生成树之prim算法

    一 背景 二  prim算法java版 package leaning.graph;/** 最小生成树之普里姆算法* */ public class PrimMiniCostSpanningTree ...

  5. 贪婪算法在求解最小生成树中的应用(JAVA)--Prim算法

    贪婪算法:通过一系列步骤来构造问题的解,每一步对目前构造的部分分解做一个拓展,直到获得问题的完整解为止,而算法的核心思想就在于,算法的每一步都必须满足以下条件:可行(满足问题的约束条件).局部最优(当 ...

  6. java实现Prim算法

    1 问题描述 何为Prim算法? 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex ...

  7. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

  8. Java 版 Prim 算法求最小生成树

    最小生成树: 一个具有n个顶点的加权的无相连通图,用n-1条边连接这n个顶点,并且使得连接之后的所有边的权值之和最小的树. Prim算法:先以一个结点作为最小生成树的第一个结点,然后以迭代的方式找出与 ...

  9. Prim算法(JAVA实现-邻接矩阵)

    简介 最小生成树介绍 Prim 算法本质就是就是求最小生成树问题, 最小生成树(Minimum Cost Spanning Tree),简称MST. 给定一个带权的无向连通图,如何选取一棵生成树,使树 ...

  10. prim算法 源码(java)

    import java.util.Comparator; import java.util.HashSet; import java.util.PriorityQueue; import java.u ...

最新文章

  1. 软件架构设计学习总结(14):大型网站技术架构(八)网站的安全架构
  2. [原创]基于frida的脱壳工具
  3. 岗位推荐 | 腾讯AI Lab招聘计算机视觉方向实习生
  4. 汇编语言学习系列 for循环实现
  5. 牛客网--2019校招--瞌睡
  6. 问题 J: 寻找复读机【模拟】
  7. 电子助力方向机控制模块_17款路虎揽胜:偶发性电子助力失效
  8. JNDI学习总结(4)——Tomcat下使用Druid配置JNDI数据源
  9. Linux指纹识别程序,linux上应用指纹识别(转载)
  10. 定时任务管理系统 java_几种任务调度的 Java 实现方法与比较(定时任务)(转)...
  11. redis 设置不过期_面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?
  12. Web前后端缓存技术(缓存的主要作用是什么)
  13. 旧手机利用(Android),当wifi,当mic,当ipcamera
  14. 关于集训7教机房没网络 问题的解决方案
  15. u盘大计算机视频,处理视频太大在无法从电脑复制到U盘的操作方法
  16. 【南宋】【文天祥】正气歌
  17. broker可以禁用吗 time_【pximouse可以禁用吗】pximouse是什么程序_pximouse是什么
  18. RSF 分布式服务框架设计:线程模型
  19. iOS Xcode中UIButton文字换行
  20. 图像修复 : ICCV 2021 基于条件纹理和结构并行生成的图像修复【翻译】

热门文章

  1. eclipse for php 配置,安装配置Eclipse for PHP
  2. InternetOpen/InternetOpenUrl/InternetReadFile 等相关Win32 网络API 使用详细说明
  3. 【JavaScript】添加DOM节点
  4. VS2010 MFC工程中 错误提示: IntelliSense: 无法打开源文件 defines.h
  5. oracle 查看tns状态,oracle for windows 监听问题之TNS-12545
  6. Java连接数据库及所需jar包
  7. 蓝桥杯|基本数学运算|高效|常用二进制运算|素数火箭版|n次方火箭版|全排列|(二)
  8. JavaScript数组越界访问
  9. Operating Systems:Three-Easy-Pieces
  10. What is co-operating?