最小生成树: 一个具有n个顶点的加权的无相连通图,用n-1条边连接这n个顶点,并且使得连接之后的所有边的权值之和最小的树。

Prim算法:先以一个结点作为最小生成树的第一个结点,然后以迭代的方式找出与最小生成树中各结点权值最小边,加到最小生成树中。加入之后如果产生回路则跳过这条边,选择下一个结点。当所有结点都加入到最小生成树中之后,就找出最小生成树了。

举个例子:

根据下图3个步骤找出最小生成树:

在写程序时,需要把连通图转化为邻接矩阵输入。假设A、B、C、D 为 1、2、3、4 :

代码如下:

package minSpanningTree;import java.util.Scanner;public class Prim {//用来初始化数组的,比结点数大就行private static final int MAXN = 100;//INF表示不存在边的长度,用一个很大的数表示它private static final int INF = 100000001;public static void main(String[] args) {Scanner s = new Scanner(System.in);System.out.println("请输入结点个数:");int n = Integer.parseInt(s.nextLine()); System.out.println("结点个数: " + n);//邻接矩阵int[][] w = new int[MAXN][MAXN];//存放父结点的集合int[] f = new int[MAXN];for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {int t = Integer.parseInt(s.nextLine());w[i][j] = (t == 0) ? INF :t;}}//生成最小生成树toPrim(w, f, n);for(int i = 2; i <= n; i++) {System.out.println(i + "------>" + f[i]);}}private static void toPrim(int w[][], int f[], int n) {//用于存放结点的权值的集合int d[] = new int[INF];int k = 0;int m;//第一个结点与其它结点的权值加入集合中for(int j = 1; j <= n; j++) {d[j] = (j == 1 ? 0 : w[1][j]);//第一个结点没有父结点,初始化为1f[j] = 1;}//从第二个结点开始for(int i = 2; i <= n; i++) {m = INF;//遍历与当前结点相连接的各个结点的权值并找出具有最小权值的结点for(int j = 1; j <= n; j++) {if(d[j] <= m && d[j] != 0) {m = d[j];k = j;}   }//将上面找到的结点加入到集合中d[k] = 0;//更新父d[],将k结点与其它结点连接的最小权值放进d[j]中for(int j = 1; j <= n; j++) {if(d[j] > w[k][j] && d[j] != 0) {d[j] = w[k][j];f[j] = k;}}}}
}

输出结果:

2——>1 —-> A –B
3——>2 —-> B –C
4——>1 —-> A –D

Java 版 Prim 算法求最小生成树相关推荐

  1. prim算法 求最小生成树

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

  2. python最小生成树算法_图算法|Prim算法求最小生成树

    01 - 一个实际问题 要在n个城市之间铺设光缆,要求有2个: 这 n 个城市的任意两个之间都可以通信: 铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此要使铺设光缆的总费用最低. 如下所示 ...

  3. prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)

    关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...

  4. Prim算法求最小生成树

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

  5. 最小生成树板子-AcWing 858. Prim算法求最小生成树

    题目分析 来源:acwing 分析: 给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|. 由 V 中的全部 n 个顶点和 E 中 n−1 ...

  6. prim算法求最小生成树_克鲁斯卡尔算法(Kruskal算法)求最小生成树

    上一节介绍了求最小生成树之普里姆算法.该算法从顶点的角度为出发点,时间复杂度为O(n2),更适合与解决边的绸密度更高的连通网.本节所介绍的克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(e ...

  7. AcWing 858. Prim算法求最小生成树(稠密图)

    题目链接 https://www.acwing.com/problem/content/description/860/ 思路 prim算法的思想就是,我们维护一个最优集合,然后寻找所有不在集合的点连 ...

  8. 普利姆算法(prim)求最小生成树(MST)过程详解

    生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程造价最小呢?可以把线路的造价看成权值求这几个城市的连通图的最小生成树.求最小造价的过程也就转化成求最小生 ...

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

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

最新文章

  1. OAuth 2.0攻击面与案例总结
  2. 转 python运算符及用法汇总
  3. 回望云计算发展 重新解读三种云服务
  4. java中整数的整数次方_数值的整数次方 - 剑指 Offer 学习心得_教程_Java开发社区...
  5. Bzoj4818--Sdoi2017序列计数
  6. POJ - 1330 Nearest Common Ancestors(树上倍增/树链剖分求LCA)
  7. 2.12 主成分分析(下)
  8. 在C#中,不安装Oracle客户端如何连接Oracle数据库
  9. Python学习笔记——基础篇【第五周】——模块
  10. Android中LocalSocket使用
  11. oracle call 存储过程 带out_详解oracle数据库存储过程调试方法
  12. AFTN和SITA报文简介
  13. python 希尔伯特变换_信号处理——Hilbert变换及谱分析
  14. UE4C++吃豆子游戏
  15. 借助微博实时号日引流200精准客源,微博实时号是什么?
  16. Windows7下chm文件打不开
  17. 操作系统之——磁盘存储器管理
  18. scrum立会报告+燃尽图(第三周第二次)
  19. charles证书信任设置
  20. C语言指针相关——经典面试题

热门文章

  1. 什么是cookie?cookie的优缺点。
  2. ET、LT、EPOLLONESHOT
  3. CSS中cellpadding和cellspacing的代替方法
  4. java中throw是什么意思_Java中throw和throws的区别是什么
  5. Win10左下角搜索框无法搜索点击无反应的解决方法
  6. silabs green power
  7. 管理系统类项目的登陆与权限功能的实现
  8. 揭明星工作室待遇:助理3000经纪人30万
  9. 关于时间序列分析中的平稳性的理解笔记
  10. 【HBZ分享】数仓里面的概念-宽表-维度表-事实表概念讲解