算法步骤:

  1. 设 G=(V,E)是连通网, T=(U,D)是最小生成树, V,U 是顶点集合, E,D 是边的集合
  2. 若从顶点 u 开始构造最小生成树, 则从集合 V 中取出顶点 u 放入集合 U 中, 标记顶点 v 的 visited[u]=1
  3. 若集合 U 中顶点 ui 与集合 V-U 中的顶点 vj 之间存在边, 则寻找这些边中权值最小的边, 但不能构成回路, 将
    顶点 vj 加入集合 U 中, 将边(ui,vj) 加入集合 D 中, 标记 visited[vj]=1
  4. 重复步骤②, 直到 U 与 V 相等, 即所有顶点都被标记为访问过, 此时 D 中有 n-1 条边

样例:求解该图的最小生成树

代码:

public class MyTest {public static void main(String[] args) {char[] data = new char[]{'A','B','C','D','E','F','G'};int verxs = data.length;//邻接矩阵的关系使用二维数组表示,10000 这个大数, 表示两个点不联通int [][]weight=new int[][]{{10000,5,7,10000,10000,10000,2},{5,10000,10000,9,10000,10000,3},{7,10000,10000,10000,8,10000,10000},{10000,9,10000,10000,10000,4,10000},{10000,10000,8,10000,10000,5,4},{10000,10000,10000,4,5,10000,6},{2,3,10000,10000,4,6,10000},};//创建 MGraph 对象MGraph graph = new MGraph(verxs);//创建一个 MinTree 对象MinTree minTree = new MinTree();minTree.createGraph(graph, verxs, data, weight);minTree.prim(graph,0);}
}
class MinTree {//初始化图public void createGraph(MGraph graph,int verxs,char[] data,int[][] weight) {int i,j;for (i = 0;i < verxs; i ++) {graph.data[i] = data[i];for (j = 0; j < verxs; j ++) {graph.weight[i][j] = weight[i][j];}}}public void showGraph(MGraph graph) {for (int[] link : graph.weight) {System.out.println(Arrays.toString(link));}}/**** @param graph 无向图* @param v 生成树的初始节点*/public void prim(MGraph graph, int v) {//visited[] 标记结点(顶点)是否被访问过int[] visited = new int[graph.verxs];//visited[] 默认元素的值都是 0, 表示没有访问过// for(int i =0; i <graph.verxs; i++) {// visited[i] = 0;// }visited[v] = 1;//h1 和 h2 记录两个顶点的下标int h1 = -1;int h2 = -1;int minWeight = 10000; //将 minWeight 初始成一个大数, 后面在遍历过程中, 会被替换for(int k = 1; k < graph.verxs; k++) {//因为有 graph.verxs 顶点, 普利姆算法结束后, 有 graph.verxs-1 边//这个是确定每一次生成的子图 , 和哪个结点的距离最近for(int i = 0; i < graph.verxs; i++) {// i 结点表示被访问过的结点for(int j = 0; j< graph.verxs;j++) {//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 重新设置为最大值 10000minWeight = 10000;}}
}class MGraph {int verxs;char[] data;int[][] weight;public MGraph(int verxs) {this.verxs = verxs;this.data = new char[verxs];this.weight = new int[verxs][verxs];}
}

输出结果:
边<A,G> 权值:2
边<G,B> 权值:3
边<G,E> 权值:4
边<E,F> 权值:5
边<F,D> 权值:4
边<A,C> 权值:7

java实现普里姆算法相关推荐

  1. Java用普里姆算法(prim)解决修路最短路径问题

    14.6 普里姆算法 14.6.1 应用场景-修路问题 看一个应用场景和问题: 有胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在需要修路把 7 个村庄连通 各个村庄的距离用边线 ...

  2. 普里姆算法(修路问题)+图解

    图解 代码实现 package com.atguigu.prim;import java.util.Arrays;/*** @创建人 wdl* @创建时间 2021/4/5* @描述*/ public ...

  3. 算法 - 普里姆算法(修路问题求解)

    从A开始,A作为定点,找到与A相连并且未被处理(不在顶点集合中)的进行处理,找到权值最小的并加入集合,A-C[7].A-G[2].A-B[5],最小的是A-G[2],所以把G加入集合,这里是有A-G的 ...

  4. 【HDU - 1301】Jungle Roads(并查集+最小生成树)(内附最小生成树两种算法 克鲁斯特尔算法amp;amp;普里姆算法)

    题干: Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. 【数据结构与算法】普里姆算法的介绍和修路问题程序实现

    目录 1. 最小生成树的介绍 2. 普里姆算法的介绍 3. 修路问题的介绍 1. 最小生成树的介绍 最小生成树(Minimum Cost Spanning Tree),简称MST.给定一个带权的无向连 ...

  6. 普里姆算法解决修路问题

    一 问题提出 1 胜利乡有7个村庄(A, B, C, D, E, F, G),现在需要修路把7个村庄连通. 2 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里. 问:如何修路保证各个 ...

  7. NOJ 1056 地道 普里姆算法+贪心法

    复习算法至普里姆算法,书上的代码不全,在oj上找了一题巩固一下. 普里姆算法应用在最小代价生成树一类的题型中,其主要执行思想是:选择一个点作为源点,此时生成树只包含一个源点,后从未加入生成树的点中选择 ...

  8. prim算法(普里姆算法)详解

    prim算法(普里姆算法)详解 了解了什么是最小生成树后,本节为您讲解如何用普里姆(prim)算法查找连通网(带权的连通图)中的最小生成树. 普里姆算法查找最小生成树的过程,采用了贪心算法的思想.对于 ...

  9. 编程中十大常用算法:(六)普里姆算法(最小生成树)

    背景 修路问题: (1)有七个村庄(A-G),现需要修路把7个村庄连通 (2)各个村庄的距离用边线(权值)表示,例如村庄A到村庄B的距离为5公里 求: 如何修路保证各个村庄都能连通,并且总的修建公路总 ...

最新文章

  1. Qt designer设计界面
  2. icu入院宣教流程图_ICU患者及家属的健康教育PPT.ppt
  3. IT运维面试问题总结-运维工具、开源应用(Ansible、Ceph、Docker、Apache、Nginx等)
  4. java使用itext将图片放到pdf模板的指定位置
  5. 6个部件组成一个圆球_2016年新课标人教版小学六年级数学上册单元练习题集
  6. 苹果iOS13将推出 这些经典手机将会被“淘汰”
  7. linux命令行可以看图片吗,活久见!Linux命令行居然也可以用来查看图像?
  8. oracle sql 执行计划分析_从Oracle数据库实验来看索引的常见执行计划
  9. .net中的设计模式---单例模式
  10. adobe reader XI 打开后闪退(或过几秒后自动退出)【解决方案】
  11. 服务器安装固态硬盘的步骤,服务器系统安装中不识别固态硬盘问题
  12. 2019JAVA面试题精粹附答案
  13. array_column()函数用法
  14. 快速解决Kubernetes从k8s.gcr.io仓库拉取镜像失败问题
  15. java bfs 迷宫例子_51-迷宫(一)- java版dfs和bfs
  16. NLP模型笔记2022-11:CTB5和CTB8数据集预处理 【PennTreebank 和Chinese Treebank】
  17. 怎么改变图片的尺寸大小?图片大小如何修改?
  18. 三表左连接sql语句例子
  19. 游戏开发笔记(一):一元夺宝
  20. epl2编程指南_epl幻想gw2回顾和gw3算法精选

热门文章

  1. HEIC苹果图片结构
  2. JS 中原型和原型链深入理解
  3. 手机网站seo关键词排名优化影响因素?
  4. ChatGPT到底是免费的还是收费的?
  5. 2023 安卓 iapp画质助手源码
  6. Java程序中用JFreeChart制作图形报表-Java基础-Java-编程开发
  7. 模糊控制——理论基础(2隶属函数)
  8. Linux内存管理(四十六):内核OOM机制详解
  9. 用Python显示真实的星空
  10. for循环语句全示例