Kruskal

Prim算法用来处理稠密图,Kruskal算法来处理稀疏图。

大致思路:

先用结构体对该的边以及点进行储存,然后根据每条边的权重来进行升序排序,
取权重最小的边放入所要维护的树中:如果该条边不在区域中才会将其放入区域中(所要维护的树中)。判断是否在区域中的方法即是:运用并查集的查找函数,用于找到顶点x所在的集合的代表元素,如果根节点相同,那么就在同一片区域中(所要维护的树中)

伪代码:

for(int i=0;i<m;i++)
{
  if(find(a)!=find(b))
{
p[find(a)]=find(b);
对应的其它条件
}

}

代码:

/*
①将所有边按权重从小到大排序
②枚举每条边a,b权重cif(a,b不连通的话)将这条边加入集合当中去
*/#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N=1e5+10;
//ans表示最小生成树的权值,cnt表示最小生成树的边数(若要表示点数,cnt的初始值应该=1)
int n,m,cnt,ans;
int p[N];struct Edge
{int a,b,w;
//重载运算符,使得该结构体可以以边的权重来排序bool operator< (const Edge &W)const{return w<W.w;}
}edge[N*2];/*
寻找该点的祖宗节点(这是并查集里的板子)
并查集的查找函数,用于找到顶点x所在的集合的代表元素,并进行路径压缩。
*/
int find(int x)
{if(p[x]!=x) p[x]=find(p[x]);return p[x];
}void kruskal()
{for(int i=0;i<m;i++){//取出每条边对应的点以及权值int a=edge[i].a,b=edge[i].b,c=edge[i].w;//如果两点不在同一区域上的话/*如果此时在同一区域上,则会有两种可能:①:已经放入区域了,不需要重复放入②:将此点放入区域后恰好使区域形成环(也就是①的特例)*/if(find(a)!=find(b)){//置为同一区域p[find(a)]=find(b);//对应区域的权值增加ans+=c;//区域边数增加cnt++;}}//n个点对应n-1条边if(cnt<n-1) cout << "impossible";else cout << ans;
}int main()
{cin >> n >> m;//初始化并查集for(int i=1;i<=n;i++) p[i]=i;for(int i=0;i<m;i++){int a,b,c;cin >> a >> b >> c;edge[i]={a,b,c};}//排序,对边的权值进行排序sort(edge,edge+m);kruskal();return 0;
}

重载运算符:

若想比较边的权重:

bool operator< (const Edge &W) const
{return w<W.w;
}
//上述Edge表示结构体名,W表示重载结构体

 若想比较点的大小:

struct Edge {int a, b, w;// 重载<运算符,首先按照a升序排序,如果a相同,则按照b升序排序bool operator< (const Edge &W)const {if (a == W.a) {return b < W.b;}return a < W.a;}
};

在这个重载的运算符中,我们首先比较两个边的第一个点a。如果a相同,我们再比较第二个点b。这样,当我们对Edge类型的数组使用sort函数时,它会首先按照a进行升序排序,如果a相同,则按照b进行升序排序。

若想进行降序:

struct Edge {int a, b, w;// 重载<运算符,首先按照a升序排序,如果a相同,则按照b降序排序bool operator< (const Edge &W)const {if (a == W.a) {return b > W.b; // 注意这里改为>,表示降序}return a < W.a;}
};

 

此外:

在C++中,当你重载一个成员函数(比如运算符)时,通常你会看到&符号,这代表函数的引用调用。对于重载的运算符,使用&可以避免不必要的复制,尤其是在处理较大的结构体时。

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

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

相关文章

常见摄像头模块性能对比

摄像头模块在现代电子设备与嵌入式开发中扮演着重要角色&#xff0c;从智能手机到安全监控系统&#xff0c;再到机器人视觉系统&#xff0c;它们无处不在。以下是一些常见的摄像头模块及其特点的对比&#xff1a; OV2640 分辨率&#xff1a;最高可达200万像素&#xff08;1600x…

vue3 antdv Modal通过设置内容里的容器的最小高度,让Modal能够适当的变高一些

1、当收款信息Collapse也折叠的时候&#xff0c;我们会发现Modal的高度也变成了很小。 2、我们希望高度稍微要高一些&#xff0c;这样感觉上面显示的Modal高度太小了&#xff0c;显示下面的效果。 3、初始的时候&#xff0c;想通过class或者style或者wrapClassName来实现&#…

交易员需要克服的十大心理问题

撰文&#xff1a;Koroush AK 编译&#xff1a;Chris&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News 一个交易者在交易上所犯下的最大的错误可能更多来自于心态的失衡而并非技术上的失误&#xff0c;类似的情况已经发生在了无数交易者身上。作为交易者…

linux自动化内存监控与告警

文章目录 前言一、脚本实现1. shell脚本实现2. 脚本功能概览 二、设置定时执行1. 编辑cron任务表2. 设置定时任务 三、通知结果示例总结 前言 在当今数字化与网络化日益普及的时代&#xff0c;系统管理与维护成为了确保业务连续性和数据安全的关键环节。其中&#xff0c;监控系…

宪法学学习笔记(个人向) Part.3

宪法学学习笔记(个人向) Part 3 3. 国家基本制度 3.1 国家性质 3.1.1 国家性质概述 国家性质的概念 国家性质也称国体&#xff0c;或国家的阶级本质&#xff0c;是指各个阶级在国家中的地位&#xff08;哪个阶层是统治阶层&#xff0c;哪个阶层是被统治阶层&#xff0c;哪个…

MT3056 交换序列

思路&#xff1a; 与题目 MT3055 交换排列 类似 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e4 10; int n, fa[N], b[N], d[N]; void init(int n) {for (int i 1; i < n; i)fa[i] i; } int find(int x) {return x fa[x] ?…

快手可图模型的要点

Kolors模型 摘要与介绍 Kolors是一个基于扩散的文本生成图像模型&#xff0c;能够生成高逼真度的图像&#xff0c;支持英文和中文。该模型结合了通用语言模型&#xff08;GLM&#xff09;和由多模态大语言模型生成的细粒度标题&#xff0c;从而提升了其理解和渲染能力。 关键…

PostgreSQL 查询字段as别名驼峰大写未生效的坑

as别名驼峰大写的错误示例: select id, game_name as gameName from app_projects;运行效果: as别名驼峰大写的正确示例: select id, game_name as "gameName" from app_projects;运行效果: 代码示例:

1.10编程基础之简单排序--02:奇数单增序列

OpenJudge - 02:奇数单增序列http://noi.openjudge.cn/ch0110/02/ 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。 输入 共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。 输出 增序输出的奇数序列,数据之间以逗号间隔。数…

Java面试题系列 - 第8天

题目&#xff1a;深入解析Java中的异常处理机制 背景说明&#xff1a;Java的异常处理机制是其强类型安全和健壮性的重要组成部分。了解如何正确地使用异常处理&#xff0c;对于编写可靠和易于维护的代码至关重要。 问题要求&#xff1a; 解释Java异常处理机制的基本概念&…

springboot 旅游导航系统-计算机毕业设计源码69476

目 录 第 1 章 引 言 1.1 选题背景 1.2 研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

「解析」Cosine-Warmup 学习率策略

参考论文&#xff1a;SGDR: Stochastic Gradient Descent with Warm Restarts Bag of Tricks for Image Classification with Convolutional Neural Networks 梯度下降算法需要我们设置一个值&#xff0c;用来控制权重更新幅度&#xff0c;我们将其称之为学习率。它是控制模型学…

PP网/尼龙网检测方案居然如此高效?

硅胶套是一种由硅胶材料制成的套管&#xff0c;通常用于保护、密封或绝缘电子元件、电线、电缆等。硅胶具有优异的耐高温、耐低温、耐化学腐蚀和绝缘性能&#xff0c;因此硅胶套常被用于需要抗高温、耐磨、耐腐蚀的环境中。硅胶套的柔软性和良好的弹性使其适合于包裹各种形状的…

3033.修改矩阵

1.题目描述 给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix &#xff0c;新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等&#xff0c;接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。 返回矩阵 answer 。 示例 1&#xff1a; 输入&am…

昇思学习打卡-14-ResNet50迁移学习

文章目录 数据集可视化预训练模型的使用部分实现 推理 迁移学习&#xff1a;在一个很大的数据集上训练得到一个预训练模型&#xff0c;然后使用该模型来初始化网络的权重参数或作为固定特征提取器应用于特定的任务中。本章学习使用的是前面学过的ResNet50&#xff0c;使用迁移学…

【Vue】vue3中使用swipe竖直方向上滚动

安装 npm install swipe使用 import swiper/css; import swiper/css/mousewheel; import { Swiper, SwiperSlide } from swiper/vue; import { Mousewheel } from swiper/modules;containerHeight 是容器的高度&#xff0c;一定要设置竖直方向上滚动高度&#xff0c;不然会非…

EtherCAT笔记(六)—— 分布时钟之一

目录 1. 分布时钟的功能 2. 分布时钟涉及到的概念 2.1 系统时间 2.2 参考时钟 & 从时钟 2.3 主站时钟 2.4 本地时钟 2.4.1 本地时钟的初始偏移量 2.4.2 本地时钟的时钟漂移 2.5 本地系统时间 2.6 传输延时 人们理解知识的一个阻碍就是那些从没见过的概念和这些概念的随意使…

【AI大模型】如何在企业环境中部署GPT-3/GPT-4模型

引言 ChatGPT4相比于ChatGPT3.5,有着诸多不可比拟的优势&#xff0c;比如图片生成、图片内容解析、GPTS开发、更智能的语言理解能力等&#xff0c;但是在国内使用GPT4存在网络及充值障碍等问题&#xff0c;如果您对ChatGPT4.0感兴趣&#xff0c;可以私信博主为您解决账号和环境…

【排序 - 快速排序】

快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它基于分治&#xff08;Divide and Conquer&#xff09;的策略。这种排序算法的核心思想是选择一个基准元素&#xff0c;将数组分割成两部分&#xff0c;使得左边的元素都小于等于基准元素&#xf…

9月Sui Builder House新加坡站开启报名

本次以建设者为主的活动包括&#xff1a; 与Sui社区互动的机会庆祝Sui生态成就的时刻公布和发布新产品建设者学习、网络交流、分享和启动新项目的机会 该活动与Token2049新加坡同期进行&#xff0c;Token2049是一个全球性会议系列&#xff0c;汇集加密货币的决策者们交换想法…