Kruskal最小生成树【详细解释+动图图解】【sort中的cmp函数】 【例题:洛谷P3366 【模板】最小生成树】

文章目录

  • Kruskal算法简介
    • Kruskal算法前置知识
      • sort 中的cmp函数
  • 算法思考
    • 样例详细示范与解释
    • kruskal模版code↓
  • 例题:洛谷P3366 【模板】最小生成树code↓
  • 完结撒花QWQ

Kruskal算法简介

K r u s k a l Kruskal Kruskal 是基于贪心算法 M S T MST MST 算法,核心思想为以边为中心查找最小生成树,时间复杂度 O ( m l o g 2 m ) O(mlog_{2}m) O(mlog2m),其中的 m m m 为边数

具体算法可分为两个步骤

1.以边权为优先级来进行排序

2.使用并查集查找连通性,如果不连通,则加边,加答案


Kruskal算法前置知识

1.对于 v e c t o r vector vector 的容器排序算法(使用 s o r t sort sort 即可)

sort(T.begin(),T.end(),cmp);//这是vector的排序方法

解释: T . b e g i n ( ) T.begin() T.begin() v e c t o r vector vector 的起始部分, T . e n d ( ) T.end() T.end() v e c t o r vector vector 的结束部分, T T T v e c t o r vector vector 的容器名

sort 中的cmp函数

c m p cmp cmp s o r t sort sort 重构函数,需要自己定义,这个函数的类型 b o o l bool bool内部变量的类型便是需要排序的容器的类型

cmp模版code如下↓

T name;
bool cmp(T x,T y){return x op y}
sort(name(first),name(last),cmp)

T T T容器类型 n a m e name name容器名字 n a m e ( f i r s t ) name(first) name(first) 代表容器的第一位 n a m e ( l a s t ) name(last) name(last) 表示容器的最后一位


2.使用结构体的构造来赋值

Edge(int a,int b,int c):u(a),v(b),w(c){};

上述构造函数的代码的意思等同于↓:

Edge(int a,int b,int c){u=a,v=b,w=c;}

在结构体里加边的操作也就为:T.push_back(Edge(u,v,w));


3.容器 v e c t o r vector vector 的定义

我们需要用容器来管理结构体

也就是将结构体给定义在容器里

vector<Node> T;//其中T为容器名,Node为结构体名

定义code总结↓:

struct Node{int u,v,w;//定义类型Edge(int a,int b,int c):u(a),v(b),w(c){};//使用构造
};
bool (Node x,Node y){return x.w<y.w}//具体使用vector里的哪一个定义排序的函数
vector<Node> T;//使用容器来管理结构体
sort(T.begin(),T.end(),cmp)//其中T为容器名

算法思考

我们先给出一个题目来进行思考↓:

x x x 市共有 n n n 个岛屿, m m m 种修桥的方案由于 x x x 市的市长是一个黑心市长,所以他想要选择一种方案使得总共修桥的钱最少
每年他可以修一座桥,问:需要几年才能使得所有的岛屿之间都可以互相同行,最少修桥的钱为多少?

我们可以知道:修桥的钱数就是边权,岛屿的名字就是点的编号

第一个问题很好解答,使得所有点之间都可以连通的最少边数 N − 1 N-1 N1 条边

第二个问题我们就需要进行 K r u s k a l Kruskal Kruskal 进行求最小生成树

输入格式为
1 1 1 行,两个整数 n n n , m m m
2 2 2 ~ n + 1 n+1 n+1 行,每行三个整数 u u u , v v v , w w w ,表示所连接的两点及其边权

我们先给出一组样例↓

4 6
1 2 11
2 3 13
3 4 9
4 1 21
1 3 23
4 2 20

样例解释如图示↓
在这里插入图片描述

样例详细示范与解释

因为我们是需要" 花最少的钱,办最多的事 ",所以我们需要先以边的权值为优先级进行排序,结果为↓

3 4 9
1 2 11
2 3 13
4 2 20
4 1 21
1 3 23

那么我们就可以开始进行判断了,每一次重复的过程为:查找两个点是否连通,如果不连通,则加边

int x=find(wei[i].u),y=find(wei[i].v);//查找两个点的祖先if(x!=y){//如果祖先相同,则他们连通,在同一个集合内f[x]=y;//将两条边连在一起ans+=wei[i].w;//将它的权值加在最终答案里cnt++;//已经连接的边数+1}

解释:因为我们最开始已经排过序了,所以如果不连通,那么这条边一定是连接这两个点的最小代价

最后,如果两个点不连通,直接加边和答案,如果边数已经满足最少边数 N − 1 N-1 N1 条,则返回答案

return cnt==n-1?ans:-1;//如果边数是n-1条则返回答案,否则没有答案,无法连接所有边

如何使用并查集查找两个点的连通性,可见我的另一篇博文:并查集【模版】& 路径压缩优化

动图视频如下:

kruskal模版code↓

int kruskal(int n,int m,vector<Edge> &wei){sort(wei.begin(),wei.end(),cmp);int ans=0,cnt=0;for(int i=0;i<m;i++){int x=find(wei[i].u),y=find(wei[i].v);if(x!=y){f[x]=y;ans+=wei[i].w;cnt++;}}return cnt==n-1?ans:-1;
}

例题:洛谷P3366 【模板】最小生成树code↓

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
struct Edge{int u,v,w;Edge(int a,int b,int c):u(a),v(b),w(c){};
};
int f[maxn]={},n,m;
bool cmp(Edge x,Edge y){return x.w<y.w;
}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);} 
vector<Edge> wei;
int kruskal(int n,int m,vector<Edge> &wei){sort(wei.begin(),wei.end(),cmp);int ans=0,cnt=0;for(int i=0;i<m;i++){int x=find(wei[i].u),y=find(wei[i].v);if(x!=y){f[x]=y;ans+=wei[i].w;cnt++;}}return cnt==n-1?ans:-1;
}
int init(){for(int i=1;i<=n;i++) f[i]=i;return 0;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++) f[i]=i;for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;wei.push_back(Edge(u,v,w));//因为是无向图,所以需要反过来再加一次边wei.push_back(Edge(v,u,w));}int ans=kruskal(n,2*m,wei);//因为是无向图,所以边数是原边数的两倍if(ans==-1) cout<<"orz";else cout<<ans;return 0;
}

这么一点代码当然是可以 A C AC AC

在这里插入图片描述

完结撒花QWQ

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

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

相关文章

导师坚鹏:厦门火炬高新区数字化转型战略蓝图从规划到落地培训

厦门火炬高新区战略制胜&#xff1a;数字化转型战略蓝图从规划到落地培训 厦门国家火炬高技术产业开发区&#xff08;简称“厦门国家火炬高新区”&#xff09;1991年被国务院批准为全国首批国家级高新区&#xff0c;是全国三个以“火炬”冠名的国家高新区之一。目前&#xff0c…

Excel通过下拉菜单,显示不同图片

背景&#xff1a;有的时候需要通过更改下拉菜单来改变对应的 值/ 图片。 如果是数值的话就是我们常常用的Vlookup&#xff0c;这个可以很简单的实现这个功能。&#xff08;这个如果不知道请自行百度&#xff09; 但是如果是图片呢&#xff1f;这个就不常见了&#xff0c;那么…

芯片工程系列(5)2.5D 3D封装

0 英语缩写 硅通孔&#xff08;Through Silicon Via&#xff0c;TSV&#xff09;硅中介层&#xff08;Silicon Interposer&#xff09;物理气象沉淀法&#xff08;Physical Vapor Deposition&#xff0c;PVD&#xff09;DRIE、CVD、PVD、CMP等设备CoWoS&#xff08;Chip on Wa…

【开发环境搭建篇】Nacos的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

安卓手机系统跳过app启动广告软件

跳过广告关于此应用声明&#xff1a; 应用利用了安卓系统的辅助功能API&#xff0c;可以读取您手机屏幕上显示的所有内容&#xff0c;并且可以以您的名义进行屏幕点击等操作。* 轻量无广告&#xff0c;不联网&#xff0c;也不需要任何权限&#xff1b;* 请务必在系统设置中开启…

Redis中AOF、RDB和复制功能对过期键的处理

AOF、RDB和复制功能对过期键的处理 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时&#xff0c;程序会对数据库中的键进行检查&#xff0c;已过期的键不会被保存到新创建的RDB文件中。 例子 举个例子&#xff0c;如果数据库中包含三个键k1、k2、k3&#x…

【目标检测实验系列】AutoDL线上GPU服务器租用流程以及如何用Pycharm软件远程连接服务器进行模型训练 (以Pycharm远程训练Yolov5项目为例子 超详细)

目录 1. 文章主要内容2. 租用AutoDL服务器详细教程2.1 注册AutoDL账号&#xff0c;并申请学生认证(学生认证有优惠&#xff0c;如果不是学生可以忽略此点)2.2 算力市场选择GPU&#xff0c;并选择初始化配置环境2.3 控制台参数解析&#xff0c;并使用相关参数登录Xftp(Windows与…

Office办公软件之word的使用(一)

前几天调整公司招标文件的格式&#xff0c;中途遇到一些问题&#xff0c;感觉自己还不是太熟悉操作&#xff0c;通过查阅资料&#xff0c;知道了正确的操作&#xff0c;就想着给记下来。如果再次遇到&#xff0c;也能很快地找到解决办法。 一、怎么把标题前的黑点去掉 解决办法…

[ C++ ] STL---list的模拟实现

目录 结点类的模拟实现 迭代器类的模拟实现 构造函数 前置与后置 前置- -与后置 - - 与 !运算符重载 * 运算符重载 -> 运算符重载 普通迭代器总体实现代码 list类的实现 list类的成员变量 构造函数 迭代器 insert(&#xff09; erase() push_front/push_back…

【SQL】1527. 患某种疾病的患者(like;通配符)

前述 知识点回顾&#xff1a; MySQL 使用OR在LIKE查询中比较多个字段 %&#xff1a;表示任意字符&#xff08;包括0个或多个&#xff09;_&#xff1a;表示任意单个字符匹配空格&#xff1a;直接用空格就行&#xff0c;例如&#xff0c;% DIAB1%可以匹配字符串ACNE DIAB100 …

Python Flask框架 -- ORM模型与表的映射

ORM模型 对象关系映射(Object Relationship Mapping)&#xff0c;简称ORM&#xff0c;是一种可以用Python面向对象的方式来操作关系型数据库的技术&#xff0c;具有可以映射到数据库表能力的Python类我们称之为ORM模型。一个ORM模型与数据库中一个表相对应&#xff0c;ORM模型中…

【国家计算机二级考试C语言.2024】学习备忘录

说明 分值 4060100 40分&#xff1a; 这里面有一大堆程序结果选这题&#xff0c;如果手速还可以。那遇到有疑问的情况就自己去倒计算器的ad E上面去打一打。能够跑出来&#xff0c;结果那是100%的没问题。 有些概念题比较讨厌&#xff0c;只能自己去记忆了。要去背诵熟熟的。…

GPU 使用率监测及可视化

1. 使用 nvidia-smi可视化 直接在终端输入nvidia-smi动态查看GPU的使用情况watch -n 0.5 nvidia-smi其中0.5表示每隔0.5秒更新一次,时间可以调整 2. 使用nvitop可视化 2.1 nvitop的使用 (1) 安装 pip install nvitop(2) 查看GPU使用率 nvitop

springboot296基于个性化定制的智慧校园管理系统设计与开发

智慧校园管理系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园综合信息管理难度大&…

maya打开bvh脚本

目录 maya打开脚本编辑器 运行打开bvh脚本 maya导出bvh脚本 maya打开脚本编辑器 打开Maya软件&#xff0c;点击右下角 “脚本编辑器” 运行打开bvh脚本 https://github.com/jhoolmans/mayaImporterBVH/blob/master/bvh_importer.py import os import re from typing impo…

训练不了AI,怎么办?

即使直接训练人工智能&#xff08;AI&#xff09;模型对许多人来说可能是一个技术上和资源上的挑战&#xff0c;仍然有多种方式可以参与、利用和推动AI技术的发展&#xff0c;而不必直接参与到模型的训练过程中。以下是一些可以考虑的途径&#xff1a; 1. 使用现有的AI服务和工…

excel处理_多个excel文件合并

data文件夹内&#xff0c;有多个xls文件。每个xls文件格式一致&#xff0c; 表头占两行&#xff0c;表位汇总数据占一行。 表头两行&#xff0c;拼接前第二行设置为表头&#xff0c;且删除第二行。 在python读入的dataframe中&#xff0c;成本表是表头&#xff0c;第一行是线路…

40 openlayers setCenter 之后 绘制了Overlay 地图定位异常

前言 这是之前在 生产环境碰到的一个问题 这个其实就是 业务上一个地图点击点位展示详情, 然后再点击另外一个点位 展示详情, 切换中心店的这个过程 其主要的问题是 使用 openlayers 的 Map.View.setCenter() 了之后, 整个地图的中心点切换到了一个莫名其妙的地方 然后 经…

MySQL多表联查会重复查找记录

在做尚上优选项目时&#xff0c;根据商品id查询商品参加的活动信息。需要根据skuid&#xff08;商品id&#xff09;对商品信息表、活动表、活动规则表进行多表联查。 但是发现&#xff0c;查询出来的数据会重复&#xff0c;如下图所示&#xff1a; 后把sql语句放在navicat中进…

web集群-lvs-DR模式基本配置

目录 环境&#xff1a; 一、配置RS 1、安装常见软件 2、配置web服务 3、添加vip 4、arp抑制 二、配置LVS 1、添加vip 2、安装配置工具 3、配置DR 三、测试 四、脚本方式配置 1、LVS-DR 2、LVS-RS 环境&#xff1a; master lvs 192.168.80.161 no…