1 问题描述
何为Prim算法?

普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。

原理简单介绍:

1).输入:一个加权连通图,其中顶点集合为V,边集合为E;

2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;

3).重复下列操作,直到Vnew = V:

a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);

b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;

4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。

2 解决方案
2.1 贪心法

本文具体编码使用数据参考自《算法设计与分析基础》第三版,下面是其具体图示:

package com.liuzhen.chapter8;import java.util.ArrayList;public class Prim {/** 参数G:给定的图,其顶点分别为0~G.length-1,相应权值为具体元素的值* 函数功能:返回构造生成的最小生成树,以二维数组形式表示,其中元素为0表示最小生成树的边*/public void getMinTree(int[][] G) {int[][] result = G;int[] vertix = new int[G.length];   //记录顶点是否被访问,如果已被访问,则置相应顶点的元素值为-2for(int i = 0;i < G.length;i++)vertix[i] = i;ArrayList<Integer> listV = new ArrayList<Integer>(); //保存已经遍历过的顶点listV.add(0);      //初始随意选择一个顶点作为起始点,此处选择顶点0vertix[0] = -2;    //表示顶点0被访问while(listV.size() < G.length) {  //当已被遍历的顶点数等于给定顶点数时,退出循环int minDistance = Integer.MAX_VALUE;    //用于寻找最小权值,初始化为int最大值,相当于无穷大的意思int minV = -1;   //用于存放未被遍历的顶点中与已被遍历顶点有最小权值的顶点int minI = -1;   //用于存放已被遍历的顶点与未被遍历顶点有最小权值的顶点  ;即G[minI][minV]在剩余的权值中最小for(int i = 0;i < listV.size();i++) {   //i 表示已被访问的顶点int v1 = listV.get(i);for(int j = 0;j < G.length;j++) {if(vertix[j] != -2) {    //满足此条件的表示,顶点j未被访问if(G[v1][j] != -1 && G[v1][j] < minDistance) {//G[v1][j]值为-1表示v1和j是非相邻顶点minDistance = G[v1][j];minV = j;minI = v1;}}}}vertix[minV] = -2;listV.add(minV);result[minI][minV] = 0;result[minV][minI] = 0;}System.out.println("使用Prim算法,对于给定图中的顶点访问顺序为:");System.out.println(listV);System.out.println("使用Prim算法,构造的最小生成树的二维数组表示如下(PS:元素为0表示树的边):");for(int i = 0;i < result.length;i++) {for(int j = 0;j < result[0].length;j++)System.out.print(result[i][j]+"\t");System.out.println();}}public static void main(String[] args) {Prim test = new Prim();int[][] G = {{-1,3,-1,-1,6,5},{3,-1,1,-1,-1,4},{-1,1,-1,6,-1,4},{-1,-1,6,-1,8,5},{6,-1,-1,8,-1,2},{5,4,4,5,2,-1}};test.getMinTree(G);}
}

运行结果:

使用Prim算法,对于给定图中的顶点访问顺序为:
[0, 1, 2, 5, 4, 3]
使用Prim算法,构造的最小生成树的二维数组表示如下(PS:元素为0表示树的边):
-1    0    -1    -1    6    5    -1    0    -1    -1    0
-1    0    -1    6    -1    4
-1    -1    6    -1    8    0    -1    -1    8    -1    0    0    4    0    0    -1

java实现Prim算法相关推荐

  1. Java:实现Prim算法(附完整源码)

    Java:实现Prim算法 package com.williamfiset.algorithms.graphtheory.examples;import static java.lang.Math. ...

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

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

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

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

  4. 【Java数据结构与算法】第十九章 贪心算法、Prim算法和Kruskal算法

    第十九章 贪心算法.Prim算法和Kruskal算法 文章目录 第十九章 贪心算法.Prim算法和Kruskal算法 一.贪心算法 1.介绍 2.支付问题 二.Prim算法 1.最小生成树 2.介绍 ...

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

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

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

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

  7. prim算法 源码(java)

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

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

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

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

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

最新文章

  1. MySQL基础篇:子查询
  2. VC连接SQL server2005
  3. Ubuntu安装pygame的过程记录与分享(包括python的卸载,openssl的安装,python3.7的安装,pygame的安装)
  4. asp.net viewstate 数据过大 导致错误
  5. 文档加载完后执行相关事件
  6. 「技术人生」第6篇:技术同学应该如何理解业务?
  7. 接口自动化测试平台-用例设计的思考
  8. 基于系统的流量控制(Qos)
  9. chrome网页自动化插件_Automation | 让网页在 Safari 和 Chrome 之间穿梭
  10. MacBook Pro 2017 13寸版 触摸板windows驱动开发(开发HID鼠标键盘驱动之一)
  11. 红外图像是什么?红外线与计算机视觉相关的研究方向?(Visible and infrared image fusion)
  12. 芯洲 DCDC SCT2433STER参数可以P2P替代TPS5430DDAR,3.8V-40V输入,3.5A,低静态电流同步降压DCDC转换器
  13. python3连接到sql server数据库,检查是否存在某个数据库,没有则创建
  14. java中怎么编写一个类_Java入门(8) 创建新类
  15. 小爱音箱连接Windows蓝牙没有声音
  16. 女孩取名:带日字旁好听有内涵的女孩名字
  17. 手持PDA连接无线网络后下载安装程序
  18. 抖音seo源码,抖音seo矩阵系统源码技术搭建
  19. 精品微信小程序健康食谱菜谱系统+后台管理系统|前后分离VUE
  20. YTU.2532: 投简历

热门文章

  1. ITK-图像主轴分析
  2. goahead之GoAction实现
  3. Redis中RDB操作
  4. 深圳中学老师工资单曝光,秒杀程序员,网友:酸了酸了
  5. 实例6.1 六度空间分数 30 DS课程组 单位 浙江大学
  6. 什么是python 包_什么是python包
  7. 常见Linux系统下载站
  8. 根据字体大小得到字符串显示时的宽度(C#)
  9. 老虎机数字抽奖(可控制结果)
  10. OpenOCD调试ARM芯片,Ubuntu 安装arm-none-eabi-gdb