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

对于连通图来说生成树定义为包含图中所有顶点的连通无环子图

而在加权连通图中权重最小的生成树被称为最小生成树

Prim算法被又称为“加点法”,我们从图中的顶点集合中任意选择一个顶点作为序列的初始子树,每次迭代的时候,以贪婪的方式扩张生成树,该算法每次只扩展一个点,迭代的总次数为n-1。所以这就要求对于每个不在树中的顶点,必须知道它连接树中顶点的最短边信息。我们可以给一个顶点附加两个标记:树中最近顶点的名称以及对应边的长度。对于任意加入生成树中的顶点来说,我们要做两步,操作一:将该顶点从集合V-Vt 移动带顶点集合Vt中,操作二:对V-Vt中的每个顶点更新。

我们以下面这个图为例子讲解Prim算法的过程:

Input:

6 10
1 2 3
1 5 6
1 6 5
2 6 5
2 3 1
3 6 4
3 4 6
4 6 5
4 5 8

5 6 2

Output:

15

完整代码如下:

import java.util.Scanner;public class Main {static int[][] e = new int[7][7];static int[] book = new int[7];static int[] dis = new int[7];static int count = 0;static int sum = 0;static int n, m;static int min, mark;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (i == j) {e[i][j] = 0;} else {e[i][j] = 99999999;}}}for (int i = 1; i <= m; i++) {int a = input.nextInt();int b = input.nextInt();int c = input.nextInt();e[a][b] = c;e[b][a] = c;}for (int i = 1; i <= n; i++) {dis[i] = e[1][i];}book[1] = 1;prime();System.out.println(sum);}private static void prim() {count++;while (count < n) {min = 99999999;for (int i = 1; i <= n; i++) {if (book[i] == 0 && dis[i] < min) {min = dis[i];mark = i;}}book[mark] = 1;count++;sum += dis[mark];for (int i = 1; i <= n; i++) {if (book[i] == 0 && dis[i] > e[mark][i]) {dis[i] = e[mark][i];}}}}
}

时间复杂度O(n^2),如果采用堆来构造一个优先队列则会使算法的时间复杂度变为O(nlogn)

很感兴趣的读者可以参考图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)这篇文章

贪婪算法在求解最小生成树中的应用(JAVA)--Prim算法相关推荐

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

    Kruskal算法又被称为"加边法",这种算法会将加权连通图的最小生成树看成具有V-1条边的无环子图,且边的权重和最小.算法开始时,会按照权重的非递减顺序对图中的边排序,之后迭代的 ...

  2. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)

    目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...

  3. 贪婪算法在求解最短路径中的应用(JAVA)--Dijkstra算法

    最短路径问题最经典的算法就是Dijkstra算法,虽然不如Floyd算法能够求全源的最短路径,但是在效率上明显强于Floyd算法. 想了解Floyd算法的读者可以参考动态规划在求解全源最短路径中的应用 ...

  4. prim算法_数据结构 7.4.1 最小生成树 Prim

    最小生成树 Minimum Spanning Tree 「最小生成树」这个词包含三部分信息 树 生成树 最小 什么是树? 树可以看做是一种特殊的图,「树没有回路」 有n个顶点的树一定有n-1条边 什么 ...

  5. hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...

    赤裸裸滴最小生成树(MST),刚学的玩意,用两种方法熟练一下.(都是greedy) Kruskal方法:先对边按照代价非递减排序,再不断添加边且不产生环路,当边数=点数-1结束.判断加入(v,w)是否 ...

  6. 学渣都能看懂的-最小生成树Prim算法(普里姆算法)

    最小生成树问题:要将图中的n个点连通,即任意两点之间都存在路径.要使连通图中各边的权值之和最小. 例: 最小生成树所要掌握的点: ·求出最小生成树权值之和 ·保存最小生成树的各边 使各边权值之和最短需 ...

  7. 小黑算法成长日记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] ...

  8. prim算法_Prim算法——最小生成树

    最小生成树的定义:最小生成树是一副连通加权无向图中一棵权值最小的生成树. 来自维基百科的定义 假设给定无向图G一共有n个顶点,那么最小生成树一定会有 n-1 条边 prim算法被用来求给定图的最小生成 ...

  9. 动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法

    动态规划在求解背包问题中的应用 背包问题向来是动态规划的典型问题,给定n个重量为w1,w2,...,wn,价值为v1,v2,...,vn的物品和一个称重量为W的背包,求这些物品中最优价值的一个子集,且 ...

最新文章

  1. 记录一下添加查询场地坐标功能中修改判断条件和画点的大小
  2. Elasticsearch上手——熟悉基本操作
  3. Day 8 面向对象
  4. Apache Hive on Apache Tez
  5. mat工具MemoryAnalyzer进行分析java内存溢出hprof文件
  6. python字符串说法错误的是_【单选题】关于Python字符串的表示方法,下列说法错误的是: A. 字符串是字符的序列表示,只能由...
  7. 关于Cococs中的CCActionEase(下)
  8. Django Ajax学习一
  9. 对‘pthread_create’未定义的引用_2018年度‘龙虎榜’统计分析(一)
  10. JS Range使用整理
  11. 基于java坦克大战游戏
  12. 怎样用关系代数表达式表示查询要求?求过程
  13. 浏览器怎么截图,这个快捷键截图也太好用了吧
  14. 《黑客与画家》-1 为什么书呆子不受欢迎?
  15. piblic class 和class的区别
  16. 微信AirSync服务之计步器
  17. edge/chrome更新113版本后页面崩溃 STATUS_STACK_BUFFER_OVERRUN解决方案
  18. 【转载】HTML 编辑器
  19. 计算机桌面文件为何不能剪贴,告诉你电脑不能复制粘贴怎么办
  20. Linux内核编译很简单,6步编译一个自己的内核

热门文章

  1. 计算机语言中tc是什么,新人必须了解的几个TC常用语和脚本基础知识!
  2. semantic ui中文文档_Vuetify-广受欢迎的Material风格的开源UI框架
  3. linux下怎样看设备的中断号,Linux设备驱动的中断处理
  4. 2019浙江C语言二级答案,2019年下半年二级C语言试题及答案
  5. linux设置静态ip后端口不能上网,Centos7设置静态IP后无法上网的解决方法
  6. vue移动端通过px动态计算图片宽高_vue图片宽高自适应_移动web图片高度自适应的解决方案...
  7. gen2服务器只显示spbc,gen2-regen培训资料.ppt
  8. 什么是大数据,大数据到底应该如何学?
  9. 加密 lua_三、Lua相关知识
  10. 计算机网络体系结构最有影响的标准,浅谈计算机网络中的体系结构