kruskal重构树

news/2024/9/20 5:41:49/文章来源:https://www.cnblogs.com/zhengchenxi/p/18326109

比较好理解,相当于重建了一个二叉树,所有的父亲节点都为原来图中的边,儿子节点为点。
重构树就可以利用lca求两点间的最大(或者最小)边权以及一些树上操作。

较为简单的应用,需要用线段树来维护信息。

点击查看代码
#include<bits/stdc++.h>
using namespace std;const int N=1e6;
int n,m,q;
int f[N][40],fa[N],tme[N];
int ls[N],rs[N],dis[N];int find(int x)
{return fa[x]==x?x:fa[x]=find(fa[x]);
}int dep[N];
void dfs(int u,int fat)
{dep[u]=dep[fat]+1;f[u][0]=fat;for(int i=1;i<=30;i++) f[u][i]=f[f[u][i-1]][i-1];if(ls[u]!=0) dfs(ls[u],u);if(rs[u]!=0) dfs(rs[u],u); 
}int lca(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);for(int i=30;i>=0;i--){if(dep[y]<=dep[f[x][i]]){x=f[x][i];}}if(x==y) return x;for(int i=30;i>=0;i--){if(f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];
}#define lson (rt<<1)
#define rson (rt<<1|1)void pushup(int rt)
{dis[rt]=lca(dis[lson],dis[rson]);
}void build(int rt,int l,int r)
{if(l==r) {dis[rt]=l;return ;}int mid=(l+r)>>1;build(lson,l,mid); build(rson,mid+1,r);pushup(rt);
}int query(int rt,int l,int r,int L,int R)
{if(L<=l&&r<=R) return dis[rt];int mid=(l+r)>>1;int ans=0;if(L<=mid) ans=query(lson,l,mid,L,R);if(R>mid) ans= ans==0?query(rson,mid+1,r,L,R):lca(ans,query(rson,mid+1,r,L,R));return ans; 
} int main()
{scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n*2-1;i++) fa[i]=i;for(int i=1;i<=n*2-1;i++) ls[i]=rs[i]=tme[i]=0;int cnt=n;for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);int fx=find(x),fy=find(y);if(fx!=fy){int u=++cnt;tme[u]=i;ls[u]=fx;rs[u]=fy;fa[fx]=fa[fy]=u;} }dfs(cnt,0);build(1,1,n);for(int i=1;i<=q;i++){int l,r;scanf("%d%d",&l,&r);printf("%d\n",tme[query(1,1,n,l,r)]);}	} 

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

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

相关文章

hive03_高级操作

Hive 分区表https://blog.csdn.net/weixin_41122339/article/details/81584110 表在存储时,可以将数据根据分区键的列值存储在表目录的子目录中。这样将数据切分到不同目录存储后,可以加快对分区键字段的查询和过滤速度,通过在查询条件中指定过滤条件,可以只对指定目录的数…

hive02_SQL操作

Hive DDL 操作 操作前需要保证 hive 成功启动: # 启动 HiveServer2 hive --service hiveserver2 & # 启动 MetaStore hive --service metastore &# 进入 hive 命令行界面 beeline -u jdbc:hive2://node03:10000 -n root数据库操作 操作类似于 MySQL 数据库操作。 表基…

【WSL2】在Windows通过自定义域名访问wsl2中的服务

前言目前在windows与windows的wsl系统之间,宿主机无法通过相对较固定的方式来进行网络访问,通常需要使用wsl的ip来访问,而ip可能不是很直观并且可能会有变更,当前教程解决了这个问题,通过hosts映射的方式实现windows宿主机访问wsl服务。 脚本的原理:在linux启动时,执行一…

查看谷歌seo内容插件

SEO META in 1 CLICK 谷歌插件可以查看网站seo内容,包括title description等信息。下载地址:https://www.chajianxw.com/developer/14081.html 下载完解压之后打开谷歌扩展程序拖入即可。 使用方式:打开需要查看的网站对应页面,加载完点击插件图标即可。

Kruskal 重构树

算法介绍 Kruskal 重构树用于快速判断节点的连通性. 考虑到,假如两个节点是联通的,则他们之间总会有一条边被选入最小生成树内,因此他们在最小生成树内也是联通的. 也就是说,我们可以通过求最小生成树来减少我们判断联通需要的边数. Kruskal 重构树的思想是这样的:假如有一…

2024牛客多校A Bit Common A Bit More Common

牛客2024年多校第一场AB题题解,新手向A Bit Common 时间限制:3s(C++/C) / 6s 内存限制:1048576K(C++/C) / 2097152K 题目描述 Given two integers \(n\) and \(m\), among all the sequences containing \(n\) non-negative integers less than \(2^m\), you need to count…

2024中国工业互联网安全大赛智能家电行业赛道选拔赛

流量分析的附件链接: https://pan.baidu.com/s/1UlWzfmsmRsZTR56FzXLuEg?pwd=6666 提取码: 6666 恶意攻击流量 描述:应用系统被植入了恶意后门,并从流量中识别其中的flag,提交格式:fag{XXXXXXXX} 追踪这个流量解码过滤或者工具一把梭flag{39084EEF2D28E941F53E4A1AA1FA6766…

java 06

输入:引入scanner import java.util.Scanner Scanner scanner=new Scanner(System.in) String name=mySanneer.nextInt()//输入内容 在命令框输入Java input 进制:十进制转二进制:不断除以2最后将余数倒着拍;转8转16相似; 位运算: 1>>2:1向右位移两位;1<<…

rockchip --- 更新固件

使用电脑上位机更新固件 uboot 运行过程,会判断 boot mode 是 normal 还是 loader,如果是 normal 则正常加载 kernel 运行,如果是 loader,则等待从 usb 获取固件上位机点击切换到 loader,会发送指令给设备,让设备改写 boot mode 标志,关机再重启,进入 uboot,读取 boot…

24金砖网络安全

ez_raw-1 题目描述:小明在电脑上画了一幅图,这幅图的内容是什么,请提交其内容的md5值(32位小写) vol查看信息查看进程看到一个绘图的软件,提取出来查看一下文件类型改后缀名之后用gimp编辑ez_raw-2 题目描述:小明电脑的登录密码是什么使用插件一把嗦了 ez_raw-3 题目描述…

24矩阵杯线下赛

24矩阵杯线下赛是在6月26日-6月27日最终排名在27名 比赛内容是内网渗透,基本上都是用工具扫 签了保密协议,题目不让放出来 这个比赛是由360安全举办的,包路费,酒店费,就感觉挺好的比赛结束之后,晚上是聚会,有抽奖,我抽到了贴纸和U盘,运气爆棚。