NOIP图论 最小生成树——Prim算法(详细图解)

news2024/11/15 23:02:29

 最小生成树的概念 

 经典题目

prim算法简介 

prim算法解析 (详细图解)

 代码实现

 代码实战


 最小生成树的概念 

在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边,而 w(u, v) 代表此的边权重,若存在 T 为 E 的子集(即)且为无循环图,使得的 w(T) 最小,则此 T 为 G 的最小生成树。最小生成树其实是最小权重生成树的简称。(简而言之就是把一个图变成一棵树,并且树中的边权和最小)

 经典题目

 P3366 【模板】最小生成树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3366

 (这道题的数据过大,为了简化问题,我们假定数据范围可以用一个二维数组存下)

prim算法简介 

prim算法基于贪心,我们每次总是选出一个离生成树距离最小的点去加入生成树,最后实现最小生成树(不做证明,理解思想即可) 

prim算法解析 (详细图解)

(随机构建一个无向图) 

  • 现在我们构建两个集合S(红色的点),V(蓝色的点),S集合中存放的是已近加入最小生成树的点,V集合中存放的是还没有加入最小生成树的点。显然刚开始时所有的点都在V集合中。
  • 然后们先将任意一个点加入集合S中(默认为点1),并且初始化所有点(除了点1)到集合S的距离是无穷大。

  •  用一个变量res存放最小生成树所有边权值的和。我们每次都选择离S集合最近的点加入S集合中,并且用新加入的点去更新dist数组,因为只有一个新的点加入到集合S中,到集合S的距离才有可能更新(贪心,每次都选最小的)。
  • 更新就是看一下能否通过新加入的点使到达集合的距离变小(看下面dist数组的变化)。
  • 我们开始在加入点1后开始第一次更新。

 

  • 现在集合S={1},集合V={2,3,4,5,6,7},根据贪心策略,我们选择离集合S最近的点加入 ,即点2,并把这一条边的权值加到res中。

  • 集合更新为S={1,2},V={3,4,5,6,7},并用点2去更新dist数组,我们发现点3和点7都可以都可以通过边2-3,2-7缩短到集合S得距离。

  • 重复上面的步骤,直到将全部的点加入到最小生成树中。 

  • 3并不能更新任何点 

 

 

  • 这样一颗最小生成树就构建完成了,权值和是57。 

 代码实现


 
 
  1. const int MAXN = 1000,INF = 0x3f3f3f3f; //定义一个INF表示无穷大。
  2. int g[MAXN][MAXN],dist[MAXN],n,m,res;
  3. //我们用g[][]数组存储这个图,dist[]储存到集合S的距离,res保存结果。
  4. bool book[MAXN]; //用book数组记录某个点是否加入到集合S中。


 
 
  1. int main()
  2. {
  3. cin>>n>>m; //读入这个图的点数n和边数m
  4. for( int i = 1 ; i<= n ;i++)
  5. {
  6. for( int j = 1; j <= n ;j++)
  7. {
  8. g[i][j] = INF; //初始化任意两个点之间的距离为正无穷(表示这两个点之间没有边)
  9. }
  10. dist[i] = INF; //初始化所有点到集合S的距离都是正无穷
  11. }
  12. for( int i = 1; i <= m ; i++)
  13. {
  14. int a,b,w;
  15. cin>>a>>b>>w; //读入a,b两个点之间的边
  16. g[a][b] = g[b][a] = w; //由于是无向边,我们对g[a][b]和g[b][a]都要赋值
  17. }
  18. prim(); //调用prim函数
  19. if(res==INF) //如果res的值是正无穷,表示不能该图不能转化成一棵树,输出orz
  20. cout<< "orz";
  21. else
  22. cout<<res; //否则就输出结果res
  23. return 0;
  24. }


 
 
  1. void prim()
  2. {
  3. dist[ 1] = 0; //把点1加入集合S,点1在集合S中,将它到集合的距离初始化为0
  4. book[ 1] = true; //表示点1已经加入到了S集合中
  5. for( int i = 2 ; i <= n ;i++)dist[i] = min(dist[i],g[ 1][i]); //用点1去更新dist[]
  6. for( int i = 2 ; i <= n ; i++)
  7. {
  8. int temp = INF; //初始化距离
  9. int t = -1; //接下来去寻找离集合S最近的点加入到集合中,用t记录这个点的下标。
  10. for( int j = 2 ; j <= n; j++)
  11. {
  12. if(!book[j]&&dist[j]<temp) //如果这个点没有加入集合S,而且这个点到集合的距离小于temp就将下标赋给t
  13. {
  14. temp = dist[j]; //更新集合V到集合S的最小值
  15. t = j; //把点赋给t
  16. }
  17. }
  18. if(t== -1){res = INF ; return ;}
  19. //如果t==-1,意味着在集合V找不到边连向集合S,生成树构建失败,将res赋值正无穷表示构建失败,结束函数
  20. book[t] = true; //如果找到了这个点,就把它加入集合S
  21. res+=dist[t]; //加上这个点到集合S的距离
  22. for( int j = 2 ; j <= n ; j++)dist[j] = min(dist[j],g[t][j]); //用新加入的点更新dist[]
  23. }
  24. }

 代码实战

纸上得来终觉浅,绝知此事要躬行,也许看完了上面的解析,你已经最prim算法有了一个大致的了解,学习算法,大致的了解是远远不够的,代码的实践永远是最重要的,学习完一个算法后一定要去自己亲手试试,每个人都有自己的代码风格,大家大可以在自己的风格之上写出自己的prim。

prim习题简介难度
P3366 【模板】最小生成树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)模板题★☆☆☆☆
P1967 [NOIP2013 提高组] 货车运输 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)基本应用★☆☆☆☆
P1991 无线通讯网 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)基本应用★☆☆☆☆

 第一题是模板,后面两题主要是更好得帮助我们理解最小生成树——prim在实际和题目中得应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1946823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI绘画进阶工具 ComfyUI 新版来啦!操作界面详解!取消悬浮面板,自带工作流管理功能!(附安装包)

大家好&#xff0c;我是画画的小强 在 7 月初的一次更新中&#xff0c;ComfyUI 官方推出了 Beta 版 UI&#xff0c;取消了原本的悬浮面板&#xff0c;还新增了工作流管理功能&#xff0c;整体使用体验比之前好了很多。今天就为大家详细介绍一些新版 UI 的特点和用法。 一、启…

GraphRAG + GPT-4o mini 低成本构建 AI 图谱知识库

更好的效果&#xff0c;更低的价格&#xff0c;听起来是不是像梦呓&#xff1f; 限制 首先&#xff0c;让我们来介绍一个词&#xff1a;RAG。 简单来说&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 的工作原理是将大型文档…

每日一题 二叉树的中序遍历

1.题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 2.题目思路 遇到二叉树问题,首先考虑用递归来实现,首先它是中序遍历.我们可以拆分成子问题来解决,即先遍历二叉树的左子树,在遍历自身,在遍历右子树即可 3.代码书写 List<Integer> list …

免杀笔记 -->API的整理Shellcode加密(过DeFender)

最近更新频率明显下降我懒&#xff0c;那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理&#xff1f; 就是用起来的时候要左翻右翻 &#xff1a;&#xff1a; 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…

声音克隆一键本地化部署 GPT-SoVITS

文章目录 GPT-SoVITS 介绍1:GPT-SoVITS安装2:GPT-SoVITS使用2.1 人声伴奏分离,去混响去延时工具2.2 语音切分工具2.3 语音降噪工具2.4 中文批量离线ASR工具2.5 语音文本校对标注工具GPT-SoVITS 介绍 GPT-SoVITS: 是一个由RVC变声器创始人“花儿不哭”推出的免费开源项目。…

php 做一个mqtt按钮,发布触发信号

在之前博客php 做一个文件下载服务器&#xff0c;得避免跨路径工具&#xff0c;安全很重要 中加了一个按钮&#xff0c;触发物联网设备返回数据。基于mqtt开发&#xff0c;如果想知道mqtt如何搭建&#xff0c;可以看我的博客【MQTT&#xff08;1&#xff09;】服务端的搭建 效…

JavaEE - HTTP状态码

Web服务器 浏览器和服务器两端进行数据交互&#xff0c;使用的就是HTTP协议&#xff08;HTTP客⼾端和 HTTP服务器之间的交互数据 的格式&#xff09;。 Web服务器就是对HTTP协议进⾏封装,程序员不需要直接对协议进⾏操作(⾃⼰写代码去解析http协议 规则)&#xff0c;让Web开发更…

2 YOLO8的使用

1 介绍 YOLOv8是YOLO (You Only Look Once) 目标检测模型系列的最新版本&#xff0c;由Ultralytics公司开发和维护。YOLOv8是在先前版本的基础上进行的重大更新&#xff0c;不仅提升了性能&#xff0c;还增加了更多的功能&#xff0c;它不仅能够进行目标检测&#xff0c;还能完…

构建智慧水利系统,优化水资源管理:结合物联网、云计算等先进技术,打造全方位、高效的水利管理系统,实现水资源的最大化利用

本文关键词&#xff1a;智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

RBAC权限管理设置

RBAC权限管理设置 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;是一种常用的访问控制机制&#xff0c;用于管理系统中的用户权限。RBAC通过将用户分配给角色&#xff0c;并将权限授予角色&#xff0c;从而控制用户对资源的访问。 基…

BUU [BSidesCF 2020]Cards

BUU [BSidesCF 2020]Cards 开题&#xff1a; 做题目之前先了解一下21点的规则&#xff1a; 二十一点玩法规则和概率在二十一点游戏中&#xff0c;拥有最高点数的玩家获胜&#xff0c;其点数必须等于或低于21点&#xff1b;超过21点的玩家称为爆牌。 2点至10点的牌以牌面的点数…

谷歌新的网站索引策略:将来可能不再为您的网站编制索引

10 年前&#xff0c;在 WordPress 上推出新博客的同时&#xff0c;Google 上的内容几乎是即时索引。 搜索引擎试图尽快向用户提供所有信息&#xff0c;这对内容创作者也有利。 然而&#xff0c;随着时间的推移&#xff0c;情况发生了变化&#xff0c;现在谷歌在索引方面变得极…

RPA软件-影刀使用

流程自动化 影刀将操作进行抽象&#xff0c;分为一下几个对象&#xff1a; 网页自动化 &#xff08;1&#xff09; 网页自动化应用场景&#xff1a;网页操作、数据抓取 &#xff08;2&#xff09; 网页操作&#xff1a;基础操作-指令操作&#xff0c;智能操作-关联元素&#…

Redis-数据的极速之旅(一)

Redis基础篇 Redis的自我介绍我的核心数据结构1.字符串&#xff08;String&#xff09;2.哈希&#xff08;Hash&#xff09;3.列表&#xff08;List&#xff09;4.集合&#xff08;Set&#xff09;5.有序集合&#xff08;Sorted Set&#xff09; 高性能原理1.Redis为什么快&…

C# VS2019 Form 图标的修改

一、 窗口的左上角图标 1、Form的属性中找到Icon项直接选择图标&#xff08;.ico&#xff09;路径,窗口左上角会自动更新选择更新的图标。 Form属性 2.发布后的exe图标

日常开发记录分享-SQL中的partition分区功能使用

文章目录 需求来源实现思路实施SQL 语句结构内部查询&#xff08;子查询&#xff09;外部查询 结果 partition的升级使用解释 验证一下看看分区 分区的一些操作1. 普通查询2. 分区表上的查询优化3. 插入数据4. 删除分区中的数据5. 分区维护操作添加新的分区删除分区重组分区 6.…

Mongodb入门介绍

文章目录 1、Mongodb&#xff1a;NoSQL数据库&#xff0c;分布式的文档型数据库2、适合场景&#xff1a;3、不适合场景&#xff1a;4、概念5、总结 1、Mongodb&#xff1a;NoSQL数据库&#xff0c;分布式的文档型数据库 2、适合场景&#xff1a; 1、web网站数据存储&#xff…

Live555源码阅读笔记:哈希表的实现

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

星环科技携手东华软件推出一表通报送联合解决方案

随着国家金融监督管理总局“一表通”试点工作的持续推进&#xff0c;星环科技携手东华软件推出了基于星环科技分布式分析型数据库ArgoDB和大数据基础平台TDH的一表通报送联合解决方案&#xff0c;并已在多地实施落地中得到充分验证。 星环科技与东华软件作为战略合作伙伴&…

功能性的安全性保障:TOKEN鉴权校验

1. 引言 在软件开发过程中&#xff0c;确保系统的安全性是至关重要的一环。它不仅关乎保护用户数据的完整性和隐私性&#xff0c;也是维护系统稳定运行的基石。我认为&#xff0c;从宏观角度审视&#xff0c;软件开发的安全性保障主要可分为两大类&#xff1a;功能性的安全性保…