【模板】最小生成树(洛谷P3366)

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz

输入格式

第一行包含两个整数 N,M,表示该图共有 N 个结点和 M 条无向边。

接下来 M 行每行包含三个整数 Xi​,Yi​,Zi​,表示有一条长度为 Zi​ 的无向边连接结点 Xi​,Yi​。

输出格式

如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出orz

输入输出样例

输入 #1复制运行

4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3

输出 #1复制运行

7

说明/提示

数据规模:

对于 20% 的数据,N≤5,M≤20。

对于 40% 的数据,N≤50,M≤2500。

对于 70% 的数据,N≤500,M≤104。

对于 100% 的数据:1≤N≤5000,1≤M≤2×105,1≤Zi​≤104,1≤Xi​,Yi​≤N。

样例解释:

所以最小生成树的总边权为 2+2+3=7。

1. 问题引入

在图论中,最小生成树是一个非常经典的问题:

在一个拥有N个顶点和M条边的带权无向图中,如何找到一棵树,使得它包含所有N个顶点,且所有边的权值之和最小?

此外,还有一个常见变种:如果图本身就是断开的(不连通),我们该如何判断?

本文将基于 Kruskal 算法,结合并查集,给出一种通解。

2. 核心算法:Kruskal (克鲁斯卡尔)

Kruskal 算法的核心思想是“贪心”

算法步骤:

  1. 排序:将所有的边按照权值(w)从小到大排序。我们希望尽可能的选权值小的边。

  2. 遍历:按顺序枚举每一条边(u, v)。

  3. 判断

    • 如果u和v已经在同一个集合里(连通),说明加上这条边会形成环,跳过

    • 如果u和v不在同一个集合,说明这条边连接了两个独立的连通分量,选中它。

    • 将u和v通过并查集合并。

  4. 终止:当我们选够了N-1条边时,最小生成树构建完成。

关键点:连通性判断

如果遍历完所有边,选中的边数仍然小于N-1,说明图是不连通的(有孤岛),此时无法生成 MST,按照题目要求输出 "orz" 。

3. 核心代码解析

3.1 结构体运算符重载

为了方便排序,我们直接在结构体内部重载<运算符。这样调用sort时就不需要写额外的cmp函数,代码封装性更好。

struct edge{ int x,y,w; //重载运算符 让边集数组按照边权从小到大排序 friend bool operator <(edge a,edge b){ return a.w<b.w; } }e[200010];//边集数组 edge mst[5010];//记录最小生成树每条边

3.2 并查集的路径压缩

这是 Kruskal 能高效运行的保证。find函数在递归查找祖先的过程中,直接将沿途节点的父指针指向根节点,将树高度压扁。

int find(int x) { if(fa[x]==x) return x; return fa[x]=find(fa[x]); // 路径压缩,下次查就是 O(1) }

4. 完整代码

//kruskal版 //首先明确什么是不连通,不连通代表图有多个连通分量 //即最后生成最小生成树后所用的边小于n-1(n是节点数) #include <iostream> #include <algorithm>//sort函数头文件 using namespace std; int fa[5010];//并查集 记录每个节点的父/祖先节点(集合中的老大) int n,m;//n个结点 m条无向边 int ans=0;//ans是mst(最小生成树)的边数 记录连了多少条边 //并查集查询+路径压缩 int find(int x){ //如果已经是根结点(集合老大)就返回 if(fa[x]==x) return x; //否则就递归找老大,并把老大给到沿途所有节点 return fa[x]=find(fa[x]); } void uni(int u,int v){ int fau=find(u);//找u老大 int fav=find(v);//找v老大 //如果老大相同就说明已经在一个集合就不需要操作 if(fau!=fav){//如果不同,就让u的老大变成v的老大的老大 fa[fav]=fau; } } struct edge{ int x,y,w; //重载运算符 让边集数组按照边权从小到大排序 friend bool operator <(edge a,edge b){ return a.w<b.w; } }e[200010];//边集数组 edge mst[5010];//记录最小生成树每条边 int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m;//n个结点 m条无向边 //初始化每个节点的老大为自己(每个点自己就是一个连通分量) for(int i=1;i<=n;i++) fa[i]=i; //创建边集数组 for(int i=1;i<=m;i++){ cin>>e[i].x>>e[i].y>>e[i].w; } //边集数组按照边权从小到大排序 sort(e+1,e+m+1); int ma=0;//记录最小生成树各边的长度之和 //取每一条边,看这条边的两端是不是同一个连通分量 for(int i=1;i<=m;i++){ int u=e[i].x; int v=e[i].y; //如果u v不连通 就把它两连起来 并把边权加进max //如果已经连通就跳过 if(find(u)!=find(v)){ ans++;//每连一条边 ans+1 //存最小生成树的边(这道题用不到) mst[ans].x=u; mst[ans].y=v; mst[ans].w=e[i].w; uni(u,v);//这条边的两端需要变成一个连通分量(集合) ma+=e[i].w; //最小生成树最多只能有n-1条边 if(ans==n-1) break; } } //如果 连接的边数==节点数-1,说明是连通图 if(ans==n-1) cout<<ma; //不等于 说明有多个连通分量 else cout<<"orz"; return 0; }

5. 总结与易错点

  1. 关于 "orz":Kruskal算法不仅能求最短路径和,还能天然地判断图的连通性。如果循环结束后ans<n-1,说明即使把所有能连的边都连上,图还是断开的。

  2. 数据范围fa数组开N大小,e数组开M大小。不要搞混。

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

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

相关文章

基于SpringBoot的集团门户网站毕业设计

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在深入探讨基于SpringBoot框架的集团门户网站的设计与实现&#xff0c;以期为我国集团企业信息化建设提供理论支持和实践指导。具体研究目的如下&#x…

百度网盘下载加速_百度不限速

百度网盘下载限速怎么破解这个很简单&#xff0c;这个方法我还是在我朋友那里找到的。下载速度也是非常夸张。我让大家看一下这个就是我测试的速度。速度还是非常夸张的。下面开始今天的教学环节打开上面图片中左上角的地址&#xff0c;你会看到一个获取文件列表按钮&#xff0…

通信原理篇---模拟通信系统

用送信来比喻通信系统想象一下&#xff0c;你要把一封手写的信&#xff08;模拟信号&#xff09;从你家送到朋友家。模拟通信系统 —— 相当于派一个邮差骑自行车&#xff0c;原封不动地拿着你的手写信直接送过去。信的内容是连续的字迹&#xff0c;邮差在路上可能会遇到下雨&a…

基于SpringBoot的项目申报管理系统毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在开发一套基于SpringBoot框架的项目申报管理系统&#xff0c;以实现项目申报流程的自动化、高效化和规范化。具体研究目的如下&#xff1a;提高项目申报…

全网最全专科生AI论文平台TOP10:开题报告文献综述必备

全网最全专科生AI论文平台TOP10&#xff1a;开题报告文献综述必备 专科生的AI论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着AI技术在学术领域的广泛应用&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的平…

论文AIGC检测保姆级攻略:从90%降至10%,这5款工具亲测有效(附知网、维普实测)

最近后台私信都要炸了&#xff0c;全是准毕业生在哀嚎&#xff1a;“学姐&#xff0c;救命&#xff01;我自己一个字一个字码的论文&#xff0c;怎么知网AIGC检测直接判定85%&#xff1f;到底怎么才能 降低AI率 &#xff1f; 说实话&#xff0c;这事儿真不怪你们。现在的检测系…

Hive视图应用:大数据分析的抽象与复用

Hive视图应用&#xff1a;大数据分析的抽象与复用 关键词&#xff1a;Hive视图、大数据分析、数据抽象、复用、逻辑视图、物理隔离、ETL优化 摘要&#xff1a;在大数据分析领域&#xff0c;Hive作为基于Hadoop的数据仓库工具&#xff0c;通过视图机制提供了强大的数据抽象能力。…

基于SpringBoot的奖学金评定管理系统毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的奖学金评定管理系统&#xff0c;以解决传统奖学金评定过程中存在的效率低下、数据管理困难、透明度不足等问题。具…

2026论文降AI必备指南:实测10大工具,免费降AI率是福利还是陷阱?一文全解析!

还在为论文截止日期焦虑的同学们&#xff0c;是不是正在为如何通过AIGC检测而发愁&#xff1f; 作为一名刚刚顺利毕业的过来人&#xff0c;我深刻理解大家当下的困境。用AI辅助完成论文固然高效&#xff0c;但随之而来的AIGC检测问题却令人头疼。我的初稿就曾因AI率过高而被导…

登上Nature子刊的捷径:LPJ模型+NPP模拟+气候响应全流程

随着全球气候变化的日益严峻&#xff0c;理解和预测植被生产力的变化变得尤为重要。此次主要目的是深入探讨植被净初级生产力&#xff08;NPP&#xff09;的模拟、驱动力分析及其气候变化响应&#xff0c;利用LPJ模型为研究工具&#xff0c;帮助学员掌握从GPP到NPP、NEP/NEE等关…

SRE 运维体系:Prometheus + Grafana + AlertManager,从零搭建企业级监控告警平台

标签&#xff1a; #SRE #Prometheus #Grafana #DevOps #监控告警 #运维&#x1f6e1;️ 前言&#xff1a;为什么选择“黄金三角”&#xff1f; Prometheus&#xff1a;基于 Pull (拉取) 模型的时序数据库。哪怕你的应用挂了&#xff0c;Prometheus 依然活着&#xff0c;能准确记…

Canvas 性能极限:如何渲染 10 万个动态粒子而不掉帧?OffscreenCanvas 是关键

标签&#xff1a; #FrontEnd #Canvas #Performance #WebWorker #OffscreenCanvas #Visualization&#x1f422; 前言&#xff1a;主线程的“堵车”现场 在传统的 <canvas> 动画中&#xff0c;我们通常使用 requestAnimationFrame。 function loop() {updatePhysics(); //…

基于SpringBoot的实习实践系统毕业设计源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的实习实践系统&#xff0c;以满足现代企业对实习生管理及实践需求。具体研究目的如下&#xff1a;构建一个功能完善…

鸿蒙 Map Kit 实战:调用华为地图服务,开发一个“周边美食搜索”原子化服务卡片

标签&#xff1a; #HarmonyOS #MapKit #SiteKit #元服务 #ArkTS #LBS&#x1f371; 前言&#xff1a;当 LBS 遇上万能卡片 传统的找店流程&#xff1a;解锁手机 -> 找 App -> 点击启动 -> 等广告 -> 搜索“美食” -> 筛选附近。 鸿蒙元服务流程&#xff1a;点亮…

R语言的贝叶斯网络模型的实践

在现代的生态、环境以及地学研究中&#xff0c;变量和变量间的因果关系推断占据了非常重要的地位。在实践中&#xff0c;变量间的因果关系研究往往求助于昂贵的实验&#xff0c;但所得结果又经常与天然环境中的实际因果联系相差甚远。统计学方法是研究天然环境中变量间关系的好…

收藏!5个递进式AI项目,让你从普通开发者跃升15万年薪架构师

AI领域正经历深刻分化&#xff0c;大多数开发者仍构建简单API封装&#xff0c;而市场急需能处理生产级复杂性的系统架构师。两者薪资差距高达15万美元。本文系统介绍5个递进式项目&#xff1a;从入门级移动应用到大师级自主工作流&#xff0c;帮助掌握编排、记忆系统和本地推理…

Bigtreetech M8P + CB2 烧写klipper 详细指南

文章目录烧写前准备烧写系统烧录系统到 eMMC1、下载烧录文件2、确保“烧录前准备完成”3、安装驱动烧录完成后调整参考链接启用Klipper系统&#xff0c;调整配置打开系统串口通讯MobaXterm串口连接&#xff0c;根据图来操作成功连接效果Wifi连接操作记得往CB2上按上天线&#x…

R3nzSkin英雄联盟皮肤修改终极指南:从新手到高手的完整教程

R3nzSkin英雄联盟皮肤修改终极指南&#xff1a;从新手到高手的完整教程 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL).Everyone is welcome to help improve it. 项目地址: https://gitcode.com/gh_mirrors/r3n/R3nzSkin R3nzSkin是一款功能强大…

通信原理篇---数字通信系统

核心比喻&#xff1a;从“送手写信”到“发电报”还记得模拟通信是 “邮差送手写信” 吗&#xff1f; 数字通信完全不同&#xff0c;它更像是 “发电报”。过程对比&#xff1a;你想说的话&#xff08;比如&#xff1a;“明天9点见面”&#xff09;模拟送信&#xff1a;把这句话…

提示工程架构师实战:用提示工程解决数字化转型中的「数据-业务断层」问题

提示工程架构师实战:用提示工程解决数字化转型中的「数据-业务断层」问题 一、前言:数字化转型的「隐痛」——数据与业务的「平行宇宙」 在过去10年的数字化转型浪潮中,我见过太多企业陷入这样的困境: 数据团队花费数百万搭建了数据仓库/湖,生成了几百张报表,但业务团队…