最小生成树——Kruskal

标题什么是生成树?

对于一张无向图,由nnn个顶点和n−1n-1n1条边构成地联通子图,叫做这个无向图 生成树

最小生成树就是指边权之和最小的生成树

请添加图片描述

如何求最小生成树?
Kruskal

介绍:

  1. 存图时只存每条边地起点、终点,而不关注节点之间的联通关系,所以不需要链式前向星邻接矩阵
  2. 然后使用边权排序,想像自己获得了nnn个点,现在需要给这nnn个点连边。
  3. 循环遍历存边地数组,对于每条边,取出它的两个端点:xxxyyy,同时使用并查集记录点与点之间是否联通。如果联通,则证明该点之间已经存在最优的边(因为权值更小的边已经排到前面去了,会被优先考虑)。如果不联通,就连上这两条边,使用并查集记录。
  4. 最后统计出该最小生成树的所有边的边权之和
代码实现

最小生成树模板题目

#include<bits/stdc++.h>
using namespace std;
int read(){int s=0,fl=1;char w=getchar();while(w>'9'||w<'0'){if(w=='-')fl=-1;w=getchar();}while(w<='9'&&w>='0'){s=s*10+(w^48);w=getchar();}return fl*s;
}
void out(int x){if(x<0)putchar('-'),x=-x;if(x<10)putchar(x+'0');else out(x/10),putchar(x%10+'0');
}
struct ed{int v,x,y;
}mp[1000010];
int f[1000010],cnt;
bool cmp(ed x,ed y){return x.v<y.v;
}
int find(int x){if(f[x]!=x) f[x]=find(f[x]);return f[x];
}
int n,m,ans;
int main(){n=read();m=read();for(int i=1;i<=m;i++){mp[i].x=read();mp[i].y=read();mp[i].v=read();//存边}sort(mp+1,mp+1+m,cmp);for(int i=1;i<=n;i++){f[i]=i;//初始化并查集}for(int i=1;i<=m;i++){int x=find(mp[i].x);int y=find(mp[i].y);if(x==y) continue;//如果最上层的祖先是一样的,则证明已经联通,跳过该条边f[x]=y;//将两条边的祖先连在一起cnt++;ans+=mp[i].v;//统计和}cnt==n-1?printf("%d",ans):printf("orz");//判断连上的节点数是否是整张图的节点数,如果不是就证明原图不连通,输出orzreturn 0;
}

双倍经验

P1967 [NOIP 2013 提高组] 货车运输

由题意可得AAA国由nnn个点,mmm条边构成,每条边权重为zzz,货车要从节点xxx走到节点yyy,每走一条边,货车的载重量不能超过当前边的权值。
此题在想不到最小生成树的情况下可以使用DijkstraDijkstraDijkstra,要求货车最大的载重量,肯定优先选择边权更大的边通过,于是设d[i]d[i]d[i]表示从节点xxx到节点iii的最大载重。判断逻辑显然可得:

if(new_dis>d[y]){d[y]=new_dis;

堆优化版DijkstraDijkstraDijkstra时间复杂度是O((V+E)logV) 但是这道题VVV=1e41e41e4,EEE=5e45e45e4,计算得最终为8.4e48.4e48.4e4,但是这只是单次DijkstraDijkstraDijkstra,算上询问次数,总时间约是2.4e92.4e92.4e9,一定超时
如果用离线处理,效率会高一些,但是还是无法通过此题

正解

使用最小生成树最近公共祖先(lca) 解决
因为无论如何货车走的路都一定是最大边权的边,然而生成树的性质有一条就是能联通所有节点,所以我们可以先对这张图求 最大生成树

然后对于每个询问xxxyyy,求出其最近公共祖先lll,然后在求lcalcalca途中维护w[i][j]w[i][j]w[i][j]表示从节点iii向上移动 2j 层后的最大值。

因为求lcalcalca的过程是倍增进行的,所以总时间复杂度是O(mlogm+nlogn+qlogn)O(m log m + n log n + q log n)O(mlogm+nlogn+qlogn)

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int read(){int s=0,fl=1;char w=getchar();while(w>'9'||w<'0'){if(w=='-')fl=-1;w=getchar();}while(w<='9'&&w>='0'){s=s*10+(w^48);w=getchar();}return fl*s;
}
void out(int x){if(x<0)putchar('-'),x=-x;if(x<10)putchar(x+'0');else out(x/10),putchar(x%10+'0');
}
int n,m,q;
int d[N],f[N],dep[N],fa[N][21];
int head[N],ne[N],to[N],v[N],tot,vis[N],w[N][21];
struct node{int x,y,v;
}mp[N];
bool cmp(node x,node y){return x.v>y.v;//求最大生成树
}
int find(int x){if(f[x]!=x) f[x]=find(f[x]);return f[x];
}
void add(int x,int y,int w){to[++tot]=y;ne[tot]=head[x];head[x]=tot;v[tot]=w;
}
void dfs(int x){vis[x]=1;for(int i=head[x];i;i=ne[i]){int u=to[i];if(vis[u]){continue;}dep[u]=dep[x]+1;fa[u][0]=x;w[u][0]=v[i];dfs(u);}
}
void kru(){for(int i=1;i<=n;i++){f[i]=i;}sort(mp+1,mp+1+m,cmp);for(int i=1;i<=m;i++){int x=find(mp[i].x);int y=find(mp[i].y);if(x==y){continue;}f[x]=y;add(mp[i].x,mp[i].y,mp[i].v);add(mp[i].y,mp[i].x,mp[i].v);}
}
int lca(int x,int y){if(find(x)!=find(y)){return -1;}int ans=2e9;if(dep[x]<dep[y]){swap(x,y);}for(int k=20;k>=0;k--){if(dep[fa[x][k]]>=dep[y]){ans=min(ans,w[x][k]);x=fa[x][k];}}if(x==y) return ans;for(int k=20;k>=0;k--){if(fa[x][k]!=fa[y][k]){x=fa[x][k];y=fa[y][k];}}ans=min(ans,min(w[x][0],w[y][0]));return ans;
}
int main(){n=read();m=read();for(int i=1;i<=m;i++){int x=read();int y=read();int v=read();mp[i].x=x;mp[i].y=y;mp[i].v=v;}q=read();kru();for(int i=1;i<=n;i++){if(vis[i]==1) continue;dep[i]=1;dfs(i);fa[i][0]=i;w[i][0]=2e9;}for(int i=1;i<=20;i++){for(int j=1;j<=n;j++){fa[j][i]=fa[fa[j][i-1]][i-1];w[j][i]=min(w[j][i-1],w[fa[j][i-1]][i-1]);//预处理倍增表}}for(int i=1;i<=q;i++){int x=read();int y=read();out(lca(x,y));putchar('\n');}return 0;
}

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

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

相关文章

ADFS 和 OAuth 的区别

ADFS 和 OAuth 的区别 ADFS(Active Directory Federation Services)和 OAuth 都是身份认证与授权领域的技术,但它们的设计目标、应用场景和实现方式有显著区别。以下从核心定义、技术特性、应用场景等方面详细对比: 核心定义与设计目标 技术 核心定义 设计目标 ADFS 微软…

神经网络参数量计算详解

1. 神经网络参数量计算基本原理 1.1 什么是神经网络参数 神经网络的参数主要包括&#xff1a; 权重&#xff08;Weights&#xff09;&#xff1a;连接不同神经元之间的权重矩阵偏置&#xff08;Bias&#xff09;&#xff1a;每个神经元的偏置项批归一化参数&#xff1a;BatchNo…

手写链路追踪

1. 什么是链路追踪 链路追踪是指在分布式系统中&#xff0c;将一次请求的处理过程进行记录并聚合展示的一种方法。目的是将一次分布式请求的调用情况集中在一处展示&#xff0c;如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等。这样就可以轻松了解…

从零开始的python学习——常量与变量

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;python学习专栏&#xff1b; 文章目录 前言 一、常量和表达式 二、变量类型 2.1、什么是变量 2.2、变量语法 &#xff08;1&a…

基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信

1 系统功能介绍 本设计是一套 基于51单片机的环境监测系统&#xff0c;能够实时采集环境光照、PM2.5、温湿度等参数&#xff0c;并通过 2.4G无线模块 NRF24L01 实现数据传输。系统具备本地显示与报警功能&#xff0c;可通过按键设置各类阈值和时间&#xff0c;方便用户进行环境…

【Flask】测试平台开发,产品管理实现添加功能-第五篇

概述在前面的几篇开发文章中&#xff0c;我们只是让数据在界面上进行了展示&#xff0c;但是没有添加按钮的功能&#xff0c;接下来我们需要开发一个添加的按钮&#xff0c;用户产品功能的创建和添加抽公共数据链接方法添加接口掌握post实现和请求数据处理前端掌握Button\Dilog…

循环高级(2)

6.练习3 打印九九乘法表7.练习3 制表符详解对齐不了原因&#xff1a;name补到8zhangsan本身就是8&#xff0c;补完就变成16解决办法&#xff1a;1.去掉zhangsan\t,这样前后都是82.name后面加2个\t加一个\t&#xff0c;name\t就是占8个&#xff0c;再加一个\t&#xff0c;就变成…

盒马生鲜 小程序 逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 部分python代码 params {&…

【Linux系统】线程控制

1. POSIX线程库 (pthreads)POSIX线程&#xff08;通常称为pthreads&#xff09;是IEEE制定的操作系统线程API标准。Linux系统通过glibc库实现了这个标准&#xff0c;提供了创建和管理线程的一系列函数。核心特性命名约定&#xff1a;绝大多数函数都以 pthread_ 开头&#xff0c…

【Spring Cloud Alibaba】前置知识

【Spring Cloud Alibaba】前置知识1. 微服务介绍1.1 系统架构的演变1.1.1 单体应用架构1.1.2 垂直应用架构1.1.3 分布式架构1.1.3.1 SOA架构1.1.4 微服务架构1. 微服务介绍 1.1 系统架构的演变 随着互联网的发展&#xff0c;网站应用的规模也在不断的扩大&#xff0c;进而导致…

2025互联网大厂Java面试1000道题目及参考答案

Java学到什么程度可以面试工作&#xff1f; 要达到能够面试Java开发工作的水平&#xff0c;需要掌握以下几个方面的知识和技能&#xff1a; 1. 基础扎实&#xff1a;熟悉Java语法、面向对象编程概念、异常处理、I/O流等基础知识。这是所有Java开发者必备的基础&#xff0c;也…

记录:HSD部署(未完成)

建数据库 相关文档&#xff1a;Confluence准备&#xff1a;CA文件和备份用的aws key。 CA文件&#xff1a;在namespace添加trust-injectionenabled的标签&#xff0c;会自动生成。 aws key&#xff1a;生成cnpg-backup-creds的secret。安装&#xff1a; 从git仓库获取values模…

【AI】提示词与自然语言处理:从NLP视角看提示词的作用机制

提示词与自然语言处理&#xff1a;从 NLP 视角看提示词的作用机制在人工智能快速发展的今天&#xff0c;大模型成为了人们关注的焦点。而要让大模型更好地理解人类意图、完成各种任务&#xff0c;提示词扮演着关键角色。从自然语言处理&#xff08;NLP&#xff09;的角度来看&a…

2025.8.29机械臂实战项目

好久没给大家更新了&#xff0c;上周末大学大四开学&#xff0c;所以停更了几天&#xff0c;回来后在做项目&#xff0c;接下来的几篇文章&#xff0c;给大家带来几个项目&#xff0c;第一个介绍的是机械臂操作&#xff0c;说是机械臂操作&#xff0c;简单来说&#xff0c;就是…

【机器学习基础】机器学习的要素:任务T、性能度量P和经验E

第一章 机器学习的本质与理论框架 机器学习作为人工智能领域的核心支柱,其理论基础可以追溯到20世纪中叶的统计学习理论。Tom Mitchell在其1997年的经典著作《Machine Learning》中给出了一个至今仍被广泛引用的学习定义:"对于某类任务T和性能度量P,一个计算机程序被认…

wav音频转C语言样点数组

WAV to C Header Converter 将WAV音频文件转换为C语言头文件的Python脚本&#xff0c;支持将音频数据嵌入到C/C项目中。 功能特性 音频格式支持 PCM格式&#xff1a;支持8位、16位、24位、32位PCM音频IEEE Float格式&#xff1a;支持32位浮点音频多声道&#xff1a;支持单声道、…

01.《基础入门:了解网络的基本概念》

网络基础 文章目录网络基础网络通信核心原理网络通信定义信息传递过程关键术语解释网络的分类网络参考模型OSI 参考模型各层核心工作分层核心原则TCP/IP 参考模型&#xff08;4 层 / 5 层&#xff0c;实际应用模型&#xff09;TCP/IP 与 OSI 模型的对应关系传输层核心协议&…

基于vue驾校管理系统的设计与实现5hl93(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表&#xff1a;项目功能&#xff1a;学员,教练,教练信息,预约信息,场地信息,时间安排,车辆信息,预约练车,时间段,驾校场地信息,驾校车辆信息,预约报名开题报告内容&#xff1a;一、选题背景与意义背景随着汽车保有量持续增长&#xff0c;驾校行业规模不断扩大&am…

灰度思维:解锁世界原有本色的密码

摘要本文深入探讨灰度思维的概念内涵及其在处理他人评价中的应用价值。研究指出&#xff0c;灰度思维作为一种超越非黑即白的思维方式&#xff0c;能够帮助个体以更客观、全面的态度接受他人评价的片面性&#xff0c;从而促进个人成长和人际关系和谐。文章分析了他人评价片面性…

动态规划--Day03--打家劫舍--198. 打家劫舍,213. 打家劫舍 II,2320. 统计放置房子的方式数

动态规划–Day03–打家劫舍–198. 打家劫舍&#xff0c;213. 打家劫舍 II&#xff0c;2320. 统计放置房子的方式数 今天要训练的题目类型是&#xff1a;【打家劫舍】&#xff0c;题单来自灵艾山茶府。 掌握动态规划&#xff08;DP&#xff09;是没有捷径的&#xff0c;咱们唯一…