LibreOJ 137. 最小瓶颈路(加强版) 题解 Kruscal重构树 ST表

声明:本题目是LibreOJ 136. 最小瓶颈路 题解 最小生成树 倍增加强版,建议先学习简单版的做法。
题目链接:LibreOJ 137. 最小瓶颈路(加强版)
题目描述:

给定一张无向图,询问两个结点之间的最小瓶颈路。u和v两个结点之间最小瓶颈路指的是u和v的每条路径中经过的最大边权的最小值。强制在线,期望实现询问时间复杂度为O(1)的算法。

题解:

给出结论:无向图的最小瓶颈路与其最小生成树上两个结点之间最小瓶颈路值相等。
上面结论的证明我们可以参考Krusca求解最小生成树的过程,对于当前可以加入的一条边(u, v, w)uv之间的最小瓶颈路当前这条边,因为在之前的过程中经过权重比w小的边不能使uv连通,根据这个过程我们便可以发现第一次让uv相连的边的权重就是最小瓶颈路(这也是为什么Kruscal重构树可以求最小瓶颈路的原理),而不难发现这个值也就是uv路径上的边权最大值。
有了上面的说明,我们可以构造Kruscal重构树,具体地:
使用Kruscal算法构造MST的时候,每选择一条边的时候,我们创建一个新的结点w,将u的根节点与w之间连接双向边,将v的根节点与w连接双向边,w的点权为当前选择的边的边权。这样构造出来的树叫做Kruscal重构树,不难发现,在该树中两个结点的LCA的点权为其最小瓶颈路(上面已经说明第一次合并的时候的边权即为最小瓶颈路,而LCA的点权就是第一次合并时选择边的边权)。我们不难发现深度越低的点的点权越大。
我们不难发现若初始有n个结点,那么Kruscal重构树一共有2n-1个结点,因此现在的问题变成了:需要快速查询两个结点的LCA的点权。如果题目不要求在线,那么我们可以通过TarjanO(n+m)的复杂度求出所有询问的LCA
如果要求在线,我们可以借助Eular序和ST表实现,我们在DFS的过程中,在进入DFS的时候与访问完某个儿子结点的时候对当前结点进行标号,同时记录每个结点的第一次编号为in[u]。通过这样操作后,对于询问u和询问v,那么对于编号in[u]~in[v](或者in[v]~in[u])中的所有编号均为LCA(u,v)所在子树的结点的编号(这一点很容易思考,读者可以自己思考)。
由于深度越大的点的点权越大,所以有了Eular序之后,问题就变成了询问in[u]~in[v](或者in[v]~in[u])上的点权最小值,由于编号是连续的,我们可以使用ST表进行O(1)复杂度的查询。

代码:LibreOJ137

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

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

相关文章

【MySQL 系列】在 Windows 上安装 MySQL

在 Windows 平台上安装 MySQL 很简单,并不需要太复杂的步骤。按照本文的步骤操练起来就可以了。 文章目录 1、下载 MySQL 安装程序2、安装 MySQL 数据库2.1、选择安装类型2.2、检查所需组件2.3、安装所选产品组件2.4、产品配置2.5、配置高可用性2.6、配置服务器类型…

【leetcode】 剑指 Offer学习计划(java版本含注释)(下)

目录 前言第十六天(排序)剑指 Offer 45. 把数组排成最小的数(中等)剑指 Offer 61. 扑克牌中的顺子(简单) 第十七天(排序)剑指 Offer 40. 最小的k个数(简单) 第…

c++11多线程:call_once

文章目录 call_once示例一示例二 call_once std::call_once是 C11 标准库中的一个函数,用于确保某个函数只会被调用一次。 单例设计模式是一种常见的设计模式,用于确保某个类只能创建一个实例。由于单例实例是全局唯一的,因此在多线程环境中…

YOLO系列中的“data.yaml”详解!

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、data.yaml介绍 YOLO系列中的data.yaml文件包含了YOLO系列模型运行所需要的数据集路径、数据集中的类别数及标签。数据集路径可以用绝对路径也可以…

Python实现股票信息查询

目前两个常用的股票信息CPI: 腾讯行情CTPAPI接口源码 新浪行情CTPAPI 使用requests模块爬取股票信息,这里以查询股票市值为例。 一、根据股票名称查询股票代码 在python文件夹下设置两个表格GPLIST.xlsx,其中是A股全部代码和股票名称&#…

如何在飞书接入ChatGPT并结合内网穿透实现公网远程访问智能AI助手

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话,在下面操作步骤中…

MySQL 高可用解决方案(双主双从)

1.环境说明 操作系统:centos7.7 主服务器:node2(192.168.1.102) 从服务器:node3(192.168.1.103) keepalived中虚拟ip(VIP):192.168.1.100 2.准备事项 主库和从库数据库的版本一致把主库的数据同步给从库一份 #对主库进行全局读锁定 FLUSH…

GEE代码条带问题——sentinel-1接缝处理的问题

问题 我有兴趣确定 NDVI 损失最大的年份。我创建了一个函数来收集所有陆地卫星图像并应用预处理。当我导出结果以识别 NDVI 损失最大年份时,生成的数据产品与陆地卫星场景足迹有可怕的接缝线。造成这种情况的原因是什么以及如何调整代码? sentinel1数据…

flutter之终极报错

看到这个报错头都大了 一开始在网上各种搜搜,然后有人说是flutter版本的问题,改完版本之后还是不对,又是各种搜搜搜 有人说是环境变量的问题,后来改了环境变量,妈的,竟然还不行,想砸电脑的心都…

Xcode :Could not build module ‘WebKit‘ 已验证解决

问题&#xff1a;Could not build module WebKit 具体报错如下&#xff1a; error: type argument nw_proxy_config_t (aka struct nw_proxy_config *) is neither an Objective-C object nor a block type property (nullable, nonatomic, copy) NSArray<nw_proxy_config_…

C++学习笔记:set和map

set和map set什么是setset的使用 关联式容器键值对 map什么是mapmap的使用map的插入方式常用功能map[] 的灵活使用 set 什么是set set是STL中一个底层为二叉搜索树来实现的容器 若要使用set需要包含头文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…

【java-面试题】start和run的区别

【java-面试题】start和run的区别 在run方法内部&#xff0c;只是单纯的描述了该线程要执行的内容。run方法是线程的入口。 在start方法内部&#xff0c;会调用到系统api&#xff0c;从而在系统内核中创建出线程&#xff0c;创建线程后&#xff0c;再自动调用run方法。 在代码…

掌握未来技术:一站式深度学习学习平台体验!

介绍&#xff1a;深度学习是机器学习的一个子领域&#xff0c;它模仿人脑的分析和学习能力&#xff0c;通过构建和训练多层神经网络来学习数据的内在规律和表示层次。 深度学习的核心在于能够自动学习数据中的高层次特征&#xff0c;而无需人工进行复杂的特征工程。这种方法在图…

大模型笔记:RAG(Retrieval Augmented Generation,检索增强生成)

1 大模型知识更新的困境 大模型的知识更新是很困难的&#xff0c;主要原因在于&#xff1a; 训练数据集固定,一旦训练完成就很难再通过继续训练来更新其知识参数量巨大,随时进行fine-tuning需要消耗大量的资源&#xff0c;并且需要相当长的时间LLM的知识是编码在数百亿个参数中…

格式规范性知识的探究式学习

对于格式规范性这种规定性的知识&#xff0c;可以采用“增删改”的方式进行控究式学习。 #include<stdio.h>int main(){printf("%.1f\n", 8.0/5.0);return 0;} 这个printf语句分两部分&#xff0c;本身的功能就是格式化输出&#xff0c;因此参数完全是格式化…

一些C语言知识

C语言的内置类型&#xff1a; char short int long float double C99中引入了bool类型&#xff0c;用来表示真假的变量类型&#xff0c;包含true&#xff0c;false。 这个代码的执行结果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED&#xff0c;有两种接法 推挽接法&#xff1a; 向寄存器写1&#xff0c;引脚输出高电平&#xff0c;LED点亮&#xff1b;向寄存器写0&#xff0c;引脚输出低电平&#xff0c;LED熄灭。 开漏接法&#xff1a; 向寄存器写0&…

Kubernetes operator 前置知识篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列的前置知识篇&#xff0c;帮助大家对 Operator 进行初步了解Kubernetes operator学习系列 快捷链接 Kubernetes operator 前置知识篇Kubernetes operator&#xff08;一&#xff0…

《精益DevOps》:填补IT服务交付的认知差距,实现高效可靠的客户期望满足

写在前面 在当今的商业环境中&#xff0c;IT服务交付已经成为企业成功的关键因素之一。然而&#xff0c;实现高效、可靠、安全且符合客户期望的IT服务交付却是一项艰巨的任务。这要求服务提供商不仅具备先进的技术能力&#xff0c;还需要拥有出色的组织协作、流程管理和态势感…

UniApp项目处理小程序分包

目前 uniApp也成为一种 App端开发的大趋势 因为在目前跨端 uniApp可以说相当优秀 可以同时兼容 H5 PC 小程序 APP 的技术 目前市场屈指可数 那么 说到微信小程序 自然就要处理分包 因为微信小程序对应用大小限制非常铭感 限制在2MB 超过之后就会无法真机调试与打包 不过需要注…