3.29 最小生成树算法
最小生成树概念
参考:什么是最小生成树?
Minimum Spanning Tree
何为生成树?
生成树是指一个联通图的极小的连通子图,它包含了图中的所有n个顶点,并只有n-1条边(构成一棵树)
生成树的一些性质:
- 一个连通图可以有多种生成树(如上图所示)
- 生成树中不存在环
- 任何一个边的加入都会使得生成树中出现环
何为最小生成树?
最小生成树是针对一个带权图来说的,就是指原图中能构成的所有生成树中,边权和最小的一颗生成树
对于下面的连通图:

可以有多种选取边(即构成了生成树的情况):

我们称权值和最小的树为最小生成树
最小生成树有什么意义呢?
接上图,如果我们需要在某城市之间修建道路,点与点之间的加权边就是两城市道路的维修费,如果我们想找到一种将所有城市都连通起来并且使得道路修建费用最小的一种方案,那么就要选择使用最小生成树。
最小生成树构建方法
两种方法都是基于贪心
有一点,其实我不太明白。“Kruskal算法维护的是边,所以不需要对于无向图存储两次边。Prim维护的是集合之间点的关系,因此需要对无向图存储两次边
克鲁斯卡尔算法(Kruskal)
算法思想
将所有的带权边按照权值从小到大排列,从最小的开始选择,如果加入该边后不会产生环,则加入,反之则不加入。直到已经选择了n-1条边。
这里不会产生环的判定比较困难,因此可以换一下想法:
就是只要选择的边的两端点不在同一连通块中即可。如下所示
使用并查集就可以检查联通问题了
#include<iostream>
#include<algorithm>using namespace std;const int N=2*1e5+10;int n,m;
int p[N];
int ans=0;//最终权值
int res=0;//已经放入的边数struct nn{int a;int b;int w;
}node[N];int cmp(nn a, nn b){return a.w<b.w;
}int find(int x){if(p[x]!=x) p[x]=find(p[x]);return p[x];
}int kruskal(){for(int i=1;i<=n;i++)p[i]=i;for(int i=1;i<=m;i++){//遍历m条边int a=node[i].a, b=node[i].b, w=node[i].w;a=find(a); b=find(b);if(a!=b){//如果不在一个联通图中p[a]=b;//连接两个点ans+=w;res++;}if(res==n-1){return res;}}return res;
}int main(){cin>>n>>m;for(int i=1;i<=m;i++){cin>>node[i].a>>node[i].b>>node[i].w;}sort(node+1,node+1+m,cmp);if(kruskal()==n-1)cout<<ans<<endl;elsecout<<"impossible"<<endl;return 0;
}
普里姆算法(Prim)
和kruskal算法(遍历边)不同的是,prim算法是对点进行遍历
算法思路
对于每个点,每次找到一个集合外的,距离该集合最近的点t。(该集合是一个已经确定了的连通块)
用点t更新集合外点到集合的距离,就是找集合外和t有连接的点,如果更小就更新,最后将点t放入集合中。(这里描述的不是很清楚)
st[j]==0&&(t==-1||dist[t]>dist[j]) 注意这里的判断,首先判断该点是否已经进入集合,然后再与上(t==-1和大小的或运算)
#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;const int N=510,INF=0x3f3f3f3f;
int n,m;int g[N][N];//用于存储边
int dist[N];//点距离集合的距离
int st[N];//表示是否已经进入集合
int ans=0;int prim(){dist[1]=0;//强制一开始选择的点就是点1for(int i=1;i<=n;i++){//外层循环是指循环n次以遍历所有n个点int t=-1;for(int j=1;j<=n;j++){if(st[j]==0&&(t==-1||dist[t]>dist[j])){t=j;} }//找到最短的dist,下标为tif(dist[t]==INF) return INF;//说明没有点能够到达当前的集合ans+=dist[t];for(int j=1;j<=n;j++){if(st[j]==0&&j!=t){//更新所有集合外的点到该集合的距离dist[j]=min(dist[j],g[t][j]);}}st[t]=1;//将点加入集合}}int main(){cin>>n>>m;memset(g,0x3f,sizeof g);for(int i=1;i<=m;i++){int a,b,c;cin>>a>>b>>c;g[a][b]=g[b][a]=min(g[a][b],c);}memset(dist,0x3f,sizeof dist);if(prim()==INF)cout<<"impossible"<<endl;elsecout<<ans<<endl;return 0;
}
相关文章:
3.29 最小生成树算法
最小生成树概念 参考:什么是最小生成树? Minimum Spanning Tree 何为生成树? 生成树是指一个联通图的极小的连通子图,它包含了图中的所有n个顶点,并只有n-1条边(构成一棵树) 生成树的一些性…...
计算机科班与培训开发编程的区别在哪里?
科班、培训班、科班培训班的模式都培养了很多编程技术人员进入IT行业,有的成为某个技术领域的专家,有的成为领导层,有的一直在默默无闻的敲代码等待35岁的到来。不管那种方式入行,这些类似的情况都存在,并且未来还会一…...
idea设置常用自设置快捷键及坐标
<!--mybatis 依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency…...
Vue 3.0 实例方法
#$watch 参数:{string | Function} source{Function | Object} callback{Object} [options] {boolean} deep{boolean} immediate{string} flush返回:{Function} unwatch用法: 侦听组件实例上的响应式 property 或函数计算结果的变化。回调函数…...
日撸 Java 三百行day1-10
文章目录说明day1 环境搭建1.1 开发环境1.2 package import 和 println1.3 编写HelloWorld.javaday2 基本算术操作2.1 加、减、乘、除、整除、取余.day3 基本if 语句3.1 if条件分支语句3.2 代码day4 闰年的计算4.1 思路整理:何为闰年?4.2 核心代码day5 基…...
Ubuntu Instant-ngp 训练自有数据集
1. 运行环境配置 conda create -n instant-ngp python3.10 conda activate instant-ngp pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple2. COLMAP稀疏重建生成transform.json colmap 环境配置参考文档; 终端定位在instant-ngp/da…...
k8s集群只一台节点,重启节点后命名空间找不到了
定位 如果您的Kubernetes集群只有一台节点,并且在重启节点之前您创建了一些命名空间和资源,那么在节点重启后,这些命名空间和资源可能会丢失。这是因为在Kubernetes中,资源和命名空间通常是存储在etcd中的。当节点重启时…...
MarkDown示例
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...
spring cloud 雪崩效应
什么是雪崩效应 雪崩就是塌方。在山坡上的积雪,如果积雪的内聚力小于重力或其他力量,则积雪便向下滑动,从而逐渐引起积雪的崩塌。 在微服务架构中,服务之间通常存在级联调用。比如,服务A调用服务B,而服…...
Python 自动化指南(繁琐工作自动化)第二版:三、函数
原文:https://automatetheboringstuff.com/2e/chapter3/ 您已经熟悉了前几章中的print()、input()和len()函数。Python 提供了几个这样的内置函数,但是您也可以编写自己的函数。函数就像一个程序中的一个小程序。 为了更好地理解函数是如何工作的&#…...
c++多线程 1
https://www.runoob.com/cplusplus/cpp-multithreading.html 两种类型的多任务处理:基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 线程 c11以后有了 标准库 1 函数 2 类成员函数 3 lambda函…...
STM32F103制作FlashDriver
文章目录前言芯片内存定义实现过程FlashDriver生成段定义擦除函数写入函数编译后的map手动测试HexView提取指定地址内容并重映射总结前言 在汽车行业控制器软件刷新流程中,一般会将Flash驱动单独进行刷写,目的是防止程序中一直存在Flash驱动的话&#x…...
springboot树形结构接口, 懒加载实现
数据库关系有父子id的, 作为菜单栏展示时需要用前端需要用到懒加载, 所谓懒加载就是接口有一个标志位isLeaf, 前端请求后通过该字段判断该节点是否还有子节点数据 创建数据库表 t_company_info结构有id和parentId标识, 用来表示父子关系 /*Navicat Premium Data TransferSourc…...
java企业级信息系统开发学习笔记02初探spring——利用组件注解符精简spring配置文件
文章目录一、学习目标二、打开01的项目三、利用组件注解符精简spring配置文件(一)创建新包,复制四个类(二)修改杀龙任务类(三)修改救美任务类(四)修改勇敢骑士类…...
用Python发送电子邮件?这也太丝滑了吧(21)
小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 猫爸赚钱养家,细想起来真的不容易啊! 起早贪黑,都是6点早起做早饭,送…...
分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测
分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测 目录分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测分类效果模型描述程序设计参考资料分类效果 模型描述 Matlab实现CNN-GRU-Attention多变量分类预测 1.data为数据集,格式为excel,12个输…...
C++提高编程(1)
C提高编程1.模板1.1模板的概念1.2函数模板1.2.1函数模板语法1.2.2函数模板注意事项1.2.3函数模板案例1.2.4普通函数与函数模板的区别1.2.5普通函数与函数模板的调用规则1.2.6模板的局限性1.3类模板1.3.1类模板语法1.3.2类模板和函数模板区别1.3.3类模板中成员函数创建时机1.3.4…...
day26 回溯算法的部分总结
回溯算法的部分总结 回溯算法是一种常用于解决排列组合问题、搜索问题的算法,它的基本思想是将问题的解空间转化为一棵树,通过深度优先搜索的方式遍历树上的所有节点,找到符合条件的解。回溯算法通常使用递归实现,每次递归时传入…...
带你玩转Python爬虫(胆小者勿进)千万别做坏事·······
这节课很危险,哈哈哈哈,逗你们玩的 目录 写在前面 1 了解robots.txt 1.1 基础理解 1.2 使用robots.txt 2 Cookie 2.1 两种cookie处理方式 3 常用爬虫方法 3.1 bs4 3.1.1 基础介绍 3.1.2 bs4使用 3.1.2 使用例子 3.2 xpath 3.2.1 xpath基础介…...
【JavaScript 】严格模式,With关键字,测试框架介绍,assert
❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录静态类型语言弱类型严格模式将过失错误转化为异常简化变量的使用With测试框架try-catch选择性捕获…...
数模小白别慌!手把手教你用Python和MATLAB搞定国赛美赛(附2022年M奖/省一代码)
数模竞赛入门指南:从零到获奖的Python与MATLAB实战路径 数学建模竞赛对于初学者而言,往往像一座难以攀登的高山。第一次面对赛题时,那种无从下手的迷茫感我至今记忆犹新——三个队友围着一道看似简单的题目,却连该用什么工具、从哪…...
矩阵按键扫描技术对比:行列扫描与反转扫描的实战解析
1. 矩阵按键扫描技术入门指南 第一次接触矩阵按键时,我完全被那些交叉的行列线搞晕了。直到在某个深夜调试项目时,才突然理解了这个设计的精妙之处——它就像城市道路的十字路口,通过行列坐标就能精准定位每个按键位置。这种设计让16个按键只…...
选题毫无头绪?高校导师推荐这几个AI论文写作工具
写论文总是卡壳?选题没方向、结构不清晰、文献找不全、语言不专业……这些痛点让很多学生倍感压力。其实,只要用对 AI 工具、走对写作流程,就能大幅提升效率。资深教授普遍建议:千笔AI(中文全流程首选) 豆包…...
新手必看:Qwen2.5-VL-7B图文对话模型部署与使用全攻略
新手必看:Qwen2.5-VL-7B图文对话模型部署与使用全攻略 1. 环境准备与快速部署 1.1 镜像简介 Qwen2.5-VL-7B-Instruct-GPTQ是基于Qwen2.5-VL-7B-Instruct模型的GPTQ量化版本,专门用于图文对话任务。这个镜像已经预装了vllm推理框架和chainlit前端界面&…...
颠覆式消息留存方案:RevokeMsgPatcher全方位防撤回技术解析
颠覆式消息留存方案:RevokeMsgPatcher全方位防撤回技术解析 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitco…...
Echarts 数据大屏实战:150套模板助力企业级可视化开发
1. 为什么企业需要Echarts数据大屏? 在数字化转型的浪潮中,数据可视化已经成为企业决策的重要工具。想象一下,当你的老板需要在3秒内了解公司当月销售情况、用户增长趋势和库存状态时,密密麻麻的Excel表格显然不是最佳选择。这时…...
Phi-3-vision-128k-instruct创意编程:用JavaScript构建交互式图像故事生成器
Phi-3-vision-128k-instruct创意编程:用JavaScript构建交互式图像故事生成器 1. 引言:当AI创意遇上前端交互 想象这样一个场景:用户上传一张随手拍的照片,通过简单的滑块调整和风格选择,几秒钟后就能获得一个与图片内…...
从“概要”到“详细”:实测CoCode AI如何接力完成软件设计全流程(附避坑指南)
从“蓝图”到“代码”:AI驱动微服务设计的全流程实战解析 当我在上个月接手一个电商平台的用户积分系统重构项目时,面对两周内交付完整技术方案的时间压力,第一次尝试用AI工具完成从需求分析到详细设计的全流程。这个过程中,AI不仅…...
Flux Sea Studio 入门:十分钟完成星图平台镜像部署并生成首张图片
Flux Sea Studio 入门:十分钟完成星图平台镜像部署并生成首张图片 想试试最近很火的AI绘画,但又觉得本地部署太麻烦,显卡要求太高?今天咱们就来聊聊一个超级省事的办法——直接在云端用Flux Sea Studio。你不需要懂代码ÿ…...
OpenClaw+Qwen3-32B自动化办公:会议纪要生成与飞书同步实战
OpenClawQwen3-32B自动化办公:会议纪要生成与飞书同步实战 1. 为什么需要自动化会议纪要 每次开完会最痛苦的事情是什么?对我来说就是整理会议纪要。作为技术负责人,每周要参加5-6个不同主题的会议,会后需要花大量时间回听录音、…...

