【学习笔记】kruskal重构树

前言

最近一场div2没开出C2,猛掉104分。
赛后补E,发现自己连E1都没思路,一问才知道是kruskal重构树。
好吧,OI时期欠下的债该还了。

kruskal重构树是什么

  1. 它是一棵 2 n − 1 2n-1 2n1 个点的二叉树。点有点权,下面记作 v a l x val_x valx
  2. 它是一个 大/小根堆,如果是最小生成树构建的就是大根堆,反之,如果是最大生成树构建的就是小根堆。
  3. 对于原图上的每一对点 ( x , y ) (x,y) (x,y),他们之间的最小/大边权 v a l x , y val_{x,y} valx,y,如果是最小生成树那就是最小边权,反之亦然。
  4. 重构树所有叶子都是原图上的点,其他的点都不是原图上的点。
  5. 如果原图不连通,你会得到一个重构树森林。

算法流程

  1. 把边按照边权排序。
  2. 初始化并查集。注意重构树有 2 n − 1 2n-1 2n1 个点,所以要开一个大小为 2 n − 1 2n-1 2n1 的并查集。
  3. r t rt rt 为当前最大的点的编号,初始化 r t = n rt=n rt=n
  4. 和 kruskal 一样,按顺序枚举边,如果两个点属于同一个集合就 continue,令 u = g e t f a t h e r ( x ) , v = g e t f a t h e r ( y ) u=getfather(x),\ v=getfather(y) u=getfather(x), v=getfather(y)
  5. r t + + rt++ rt++ f a u = f a v = r t fa_u=fa_v=rt fau=fav=rt v a l r t = w x , y val_{rt}=w_{x,y} valrt=wx,y。也就是新建一个点作为 u 和 v 的父亲,并令它的点权等于边权。

例题

[NOI2018] 归程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

毫无疑问,我们肯定要预处理所有点到 1 号点的最短路。
如果是在最大生成树上跑的话,你会发现根本没法做。
考虑根据海拔建 kruskal 重构树。对于一个点 u,如果 v a l u > p val_u>p valu>p v a l f a u ≤ p val_{fa_u}\leq p valfaup,那么 u u u 子树内的所有点都是可以不花任何代价互相到达的。于是我们需要预处理子树内的点到达 1 号点的最短距离,dfs即可。
对于一个出发点 v v v,我们需要找到最后一个没有被淹没的祖先,用倍增即可。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+7,inf=1e18,mod=998244353,S=21;
vector<vector<int>> e,f;
vector<vector<array<int,2>>> E;
vector<int> val,dis,fa;
int n,m;
int gf(int x)
{return x==fa[x]?x:fa[x]=gf(fa[x]);
}
void dij()
{priority_queue<array<int,2>,vector<array<int,2>>,greater<array<int,2>>> q;q.push({0,1});dis.assign(2*n,inf);dis[1]=0;vector<int> vis(n+1);while(!q.empty()){int u=q.top()[1]; q.pop();if(vis[u]) continue;vis[u]=1;for(auto [v,w]:E[u]){if(vis[v]||dis[u]+w>=dis[v])continue;dis[v]=dis[u]+w;q.push({dis[v],v});}}
}
void dfs(int u,int fa)
{f[u][0]=fa;for(int j=1; j<S; j++){f[u][j]=f[f[u][j-1]][j-1];}for(auto v:e[u]){dfs(v,u);dis[u]=min(dis[u],dis[v]);}
}
int query(int u,int p)
{for(int i=S-1; i>=0; i--){if(val[f[u][i]]>p)u=f[u][i];}return dis[u];
}
void O_o()
{cin>>n>>m;e.assign(n*2,vector<int>());val.assign(n*2,0);vector<array<int,4>> edge;//a,l,u,vE.assign(n+1,vector<array<int,2>>());for(int i=1; i<=m; i++){int u,v,l,a;cin>>u>>v>>l>>a;E[u].push_back({v,l});E[v].push_back({u,l});edge.push_back({a,l,u,v});}dij();sort(edge.begin(),edge.end(),greater<>());fa.assign(2*n,0);for(int i=1; i<=n*2-1; i++) fa[i]=i;int rt=n;for(auto [a,l,x,y]:edge){int u=gf(x),v=gf(y);if(u==v) continue;rt++;fa[u]=rt;fa[v]=rt;e[rt].push_back(u);e[rt].push_back(v);val[rt]=a;}f.assign(2*n,vector<int>(21,0));dfs(rt,0);int Q,K,S;cin>>Q>>K>>S;int ans=0;while(Q--){int v,p;cin>>v>>p;v=(v+K*ans-1)%n+1;p=(p+K*ans)%(S+1);ans=query(v,p);cout<<ans<<"\n";}
}
signed main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cout<<fixed<<setprecision(12);int T=1;cin>>T;while(T--){O_o();}
}

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

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

相关文章

异常场景分析

优质博文&#xff1a;IT-BLOG-CN 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、异常处理类 Java把异常当做是破坏正常流程的一个事件&#xff0c;当事件发生后&#xff0c;…

https访问报错:net::ERR_CERT_DATE_INVALLD

目录 简介异常排查原因解决补充 简介 访问https资源出现报错 异常 排查 将地址拿到浏览器进行访问&#xff0c;可以很清晰的看到出现该问题的原因 原因 1、SSL证书已过期 2、服务器日期不准&#xff0c;不在证书有效期 解决 1、重新申请SSL证书&#xff0c;并配置 2、校正…

VMware桥接模式无法连接网络

windows下打开控制面板&#xff0c;找到WLAN&#xff0c;记住下面的名称&#xff08;带有VMware的都是虚拟机的网卡&#xff0c;要找到物理主机的网卡&#xff09; 回到VMware&#xff0c;编辑——打开虚拟网络编辑器 桥接选择上面的WLAN下的网络名称&#xff0c;确定即可。&…

【学习笔记】手写一个简单的 Spring MVC

目录 一、什么是Spring MVC &#xff1f; Spring 和 Spring MVC 的区别&#xff1f; Spring MVC 的运行流程&#xff1f; 二、实现步骤 1. DispatcherServlet 1. 创建一个中央分发器 拦截所有请求 测试 2. 接管 IOC 容器 1. 创建配置文件 2. 修改 web.xml 配置文件 …

输电线路悬垂线夹检测无人机航拍图像数据集,总共1600左右图片,悬垂线夹识别,标注为voc格式

输电线路悬垂线夹检测无人机航拍图像数据集&#xff0c;总共1600左右图片&#xff0c;悬垂线夹识别&#xff0c;标注为voc格式 输电线路悬垂线夹检测无人机航拍图像数据集介绍 数据集名称 输电线路悬垂线夹检测数据集 (Transmission Line Fittings Detection Dataset) 数据集…

在mac中通过ip连接打印机并实现双面打印

首先需要找到电脑自带的打印。添加打印机。 填写好打印机的ip地址&#xff0c;然后添加。 填写好ip地址后&#xff0c;直接添加就行 添加完打印机后其实就可以打印了。但是有些功能可能实现不了&#xff0c;比如说双面打印。为了实现双面打印的功能&#xff0c;需要再进行设置…

代码随想录算法训练营第五十四天|LeetCode42 接雨水、LeetCode84 柱状图中最大的矩形

LeetCode42 接雨水 代码随想录题目链接/文章讲解/视频讲解&#xff1a; 代码随想录代码随想录PDF&#xff0c;代码随想录网站&#xff0c;代码随想录百度网盘&#xff0c;代码随想录知识星球&#xff0c;代码随想录八股文PDF&#xff0c;代码随想录刷题路线&#xff0c;代码随…

GEE开发之Modis_NDWI数据分析和获取

GEE开发之Modis_NDWI数据分析和获取 0 数据介绍NDWI介绍MOD09GA介绍 1 NDWI天数据下载2 NDWI月数据下载3 NDWI年数据下载 前言&#xff1a;本文主要介绍Modis下的NDWI数据集的获取。归一化差异水指数 (NDWI) 对植被冠层液态水含量的变化很敏感。它来自近红外波段和第二个红外波…

PMP--冲刺题--解题--21-30

文章目录 11.风险管理--数据分析--成本效益分析--如果能够把单个项目风险的影响进行货币量化&#xff0c;那么就可以通过成本收益分析来确定备选风险应对策略的成本有效性。 特性要取消&#xff0c;要想继续做的话&#xff0c;就得看能不能给组织带来收益。21、 [单选] 在迭代审…

【NoSQL】portswigger NoSQL注入 labs 全解

目录 NoSQL NoSQL 数据库模型 NoSQL 注入的类型 NoSQL 语法注入 检测 MongoDB 中的语法注入 lab1:检测 NoSQL 注入 NoSQL 运算符注入 提交查询运算符 检测 MongoDB 中的运算符注入 lab2:利用 NoSQL 运算符注入绕过身份验证 利用语法注入来提取数据 MongoDB 中的数据…

Golang | Leetcode Golang题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; func numberOfArithmeticSlices(nums []int) (ans int) {f : make([]map[int]int, len(nums))for i, x : range nums {f[i] map[int]int{}for j, y : range nums[:i] {d : x - ycnt : f[j][d]ans cntf[i][d] cnt 1}}return }

Ubuntu 搭建 GitLab

1. 安装依赖&#xff1a; sudo apt update sudo apt install -y curl openssh-server ca-certificates2. 添加 GitLab 包仓库&#xff1a; curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash3. 安装 GitLab&#xff1a; s…

UE5数字人制作平台使用及3D模型生成

第10章 数字人制作平台使用及3D模型生成 在数字娱乐、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等领域&#xff0c;高质量的3D模型是数字内容创作的核心。本章将引导你了解如何使用UE5&#xff08;Unreal Engine 5&#xff09;虚幻引擎这一强大…

多模态大语言模型(MLLM)-Blip2深度解读

前言 Blip2是一个多模态大语言模型&#xff0c;因其提出时间较早&#xff08;2023年&#xff09;&#xff0c;且效果较好&#xff0c;很快成为一个标杆性工作。Blip2中提出的Q-former也成为衔接多模态和文本的重要桥梁。 Blip2发表时间是2023年&#xff0c;现在引用已经3288了…

【AIGC】ChatGPT是如何思考的:探索CoT思维链技术的奥秘

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;什么是CoT思维链CoT思维链的背景与技术发展需求 &#x1f4af;CoT思维链的工作原理&#x1f4af;CoT思维链的应用领域&#x1f4af;CoT思维链的优势&#x1f4af;CoT思维…

【JavaEE】【多线程】进程与线程的概念

目录 进程系统管理进程系统操作进程进程控制块PCB关键属性cpu对进程的操作进程调度 线程线程与进程线程资源分配线程调度 线程与进程区别线程简单操作代码创建线程查看线程 进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;可以把进程看做程序的一次运行过程&a…

【EXCEL数据处理】000014 案例 EXCEL分类汇总、定位和创建组。附多个操作案例。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000014 案例 EXCEL分类汇总、定位和创建组。附多个操…

SpringBoot MyBatis连接数据库设置了encoding=utf-8还是不能用中文来查询

properties的MySQL连接时已经指定了字符编码格式&#xff1a; url: jdbc:mysql://localhost:3306/sky_take_out?useUnicodetrue&characterEncodingutf-8使用MyBatis查询&#xff0c;带有中文参数&#xff0c;查询出的内容为空。 执行的语句为&#xff1a; <select id&…

LeetCode讲解篇之139. 单词拆分

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用一个数组记录字符串s在[0, i)区间能否使用wordDict组成 我们使用左右指针遍历字符串s的子串&#xff0c;左指针 j 为子串的左端点下标&#xff0c;右指针 i 为右端点下标的下一个 遍历过程中如果字符串s…

怎么成为年薪53万的AI产品经理?我分析了200份大厂的招聘要求

我在 BOSS 直聘搜索AI产品经理&#xff0c;筛选了公司规模在10000人以上的公司&#xff0c;清洗整理后得到 229 个岗位信息&#xff0c;分析得到如下信息&#xff1a; 按最低薪资算&#xff0c;平均年薪 40.2 万&#xff1b;取薪资范围均值&#xff0c;平均年薪 52.9 万;只有 …