贪婪算法在求解最小生成树中的应用(JAVA)--Prim算法
贪婪算法:通过一系列步骤来构造问题的解,每一步对目前构造的部分分解做一个拓展,直到获得问题的完整解为止,而算法的核心思想就在于,算法的每一步都必须满足以下条件:可行(满足问题的约束条件)、局部最优(当前步骤所有可行选择中的局部最优解)、不可取消(一旦选择,在后续步骤中不可改变)。
对于连通图来说生成树定义为包含图中所有顶点的连通无环子图
而在加权连通图中权重最小的生成树被称为最小生成树
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算法相关推荐
- 贪婪算法在求解最小生成树中的应用(JAVA)--Kruskal算法
Kruskal算法又被称为"加边法",这种算法会将加权连通图的最小生成树看成具有V-1条边的无环子图,且边的权重和最小.算法开始时,会按照权重的非递减顺序对图中的边排序,之后迭代的 ...
- 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
目录 一.最小生成树简介 二.普里姆算法(Prim) 1.原理 2.存储 2-1.图顶点和权: 2-3. 最小生成树: 3.Prim()函数 3-1.新顶点入树 3-2.保留最小权 3-3. 找到最小 ...
- 贪婪算法在求解最短路径中的应用(JAVA)--Dijkstra算法
最短路径问题最经典的算法就是Dijkstra算法,虽然不如Floyd算法能够求全源的最短路径,但是在效率上明显强于Floyd算法. 想了解Floyd算法的读者可以参考动态规划在求解全源最短路径中的应用 ...
- prim算法_数据结构 7.4.1 最小生成树 Prim
最小生成树 Minimum Spanning Tree 「最小生成树」这个词包含三部分信息 树 生成树 最小 什么是树? 树可以看做是一种特殊的图,「树没有回路」 有n个顶点的树一定有n-1条边 什么 ...
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...
赤裸裸滴最小生成树(MST),刚学的玩意,用两种方法熟练一下.(都是greedy) Kruskal方法:先对边按照代价非递减排序,再不断添加边且不产生环路,当边数=点数-1结束.判断加入(v,w)是否 ...
- 学渣都能看懂的-最小生成树Prim算法(普里姆算法)
最小生成树问题:要将图中的n个点连通,即任意两点之间都存在路径.要使连通图中各边的权值之和最小. 例: 最小生成树所要掌握的点: ·求出最小生成树权值之和 ·保存最小生成树的各边 使各边权值之和最短需 ...
- 小黑算法成长日记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] ...
- prim算法_Prim算法——最小生成树
最小生成树的定义:最小生成树是一副连通加权无向图中一棵权值最小的生成树. 来自维基百科的定义 假设给定无向图G一共有n个顶点,那么最小生成树一定会有 n-1 条边 prim算法被用来求给定图的最小生成 ...
- 动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法
动态规划在求解背包问题中的应用 背包问题向来是动态规划的典型问题,给定n个重量为w1,w2,...,wn,价值为v1,v2,...,vn的物品和一个称重量为W的背包,求这些物品中最优价值的一个子集,且 ...
最新文章
- 记录一下添加查询场地坐标功能中修改判断条件和画点的大小
- Elasticsearch上手——熟悉基本操作
- Day 8 面向对象
- Apache Hive on Apache Tez
- mat工具MemoryAnalyzer进行分析java内存溢出hprof文件
- python字符串说法错误的是_【单选题】关于Python字符串的表示方法,下列说法错误的是:
A. 字符串是字符的序列表示,只能由...
- 关于Cococs中的CCActionEase(下)
- Django Ajax学习一
- 对‘pthread_create’未定义的引用_2018年度‘龙虎榜’统计分析(一)
- JS Range使用整理
- 基于java坦克大战游戏
- 怎样用关系代数表达式表示查询要求?求过程
- 浏览器怎么截图,这个快捷键截图也太好用了吧
- 《黑客与画家》-1 为什么书呆子不受欢迎?
- piblic class 和class的区别
- 微信AirSync服务之计步器
- edge/chrome更新113版本后页面崩溃 STATUS_STACK_BUFFER_OVERRUN解决方案
- 【转载】HTML 编辑器
- 计算机桌面文件为何不能剪贴,告诉你电脑不能复制粘贴怎么办
- Linux内核编译很简单,6步编译一个自己的内核
热门文章
- 计算机语言中tc是什么,新人必须了解的几个TC常用语和脚本基础知识!
- semantic ui中文文档_Vuetify-广受欢迎的Material风格的开源UI框架
- linux下怎样看设备的中断号,Linux设备驱动的中断处理
- 2019浙江C语言二级答案,2019年下半年二级C语言试题及答案
- linux设置静态ip后端口不能上网,Centos7设置静态IP后无法上网的解决方法
- vue移动端通过px动态计算图片宽高_vue图片宽高自适应_移动web图片高度自适应的解决方案...
- gen2服务器只显示spbc,gen2-regen培训资料.ppt
- 什么是大数据,大数据到底应该如何学?
- 加密 lua_三、Lua相关知识
- 计算机网络体系结构最有影响的标准,浅谈计算机网络中的体系结构