首页 > 其他分享 >kruskal重构树

kruskal重构树

时间:2024-07-26 19:40:59浏览次数:19  
标签:rt 重构 int kruskal mid fa ans dep

比较好理解,相当于重建了一个二叉树,所有的父亲节点都为原来图中的边,儿子节点为点。
重构树就可以利用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)]);
	}	
	
} 

标签:rt,重构,int,kruskal,mid,fa,ans,dep
From: https://www.cnblogs.com/zhengchenxi/p/18326109

相关文章

  • ceph数据重构原理
    本文分享自天翼云开发者社区《ceph数据重构原理》,作者:x****n在分布式存储系统Ceph中,硬盘故障是一种常见问题。为了保证数据安全,当发生硬盘故障后,分布式存储系统会依据算法对故障硬盘上的数据进行数据重构及转储。和一般分布式系统一样的是,Ceph同样使用多副本机制来保证数据的高......
  • Kruskal 重构树学习笔记
    Kruskal想必大家都不陌生,这是一种求最小生成树的算法。关于Kruskal重构树,就是把一张图转化为一个堆。具体来说,我们可以处理出来从\(u\)到\(v\)路径中的点权或边权的极值。比如上面这张图(前为编号,[]内为点权),我们可以将它重构为小顶堆,如下请注意,这棵树有着严格的方向,......
  • 如何重构这个netCDF?
    更新:我将文件上传到dropbox,可以通过此链接下载(我希望这有效,我不经常使用dropbox):https://www.dropbox.com/scl/fi/vd0s9g080m8h9fxh7rn9l/IASISND02_20240702161759Z_20240702175655Z_epct_d9f95b34_F.nc?rlkey=isrwelpr9abbqswr91unrhpkp&st=6hkb5u2l&dl=0我已经......
  • 最小生成树(Kruskal和Prim算法)
    最小生成树(Kruskal和Prim算法)部分资料来源于:最小生成树(Kruskal算法)_kruskal算法求最小生成树-CSDN博客、【算法】最小生成树——Prim和Kruskal算法-CSDN博客关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。强连通图:在有向......
  • PCL使用贪婪三角形算法曲面重构
    内容介绍贪婪投影三角化算法是一种对原始点云进行快速三角化的算法,该算法假设曲面光滑,点云密度变化均匀,不能在三角化的同时对曲面进行平滑和孔洞修复。方法:(1)将三维点通过法线投影到某一平面(2)对投影得到的点云作平面内的三角化(3)根据平面内三位点的拓扑连接关系获得一个......
  • 0195-重构代码逻辑
    环境Time2022-11-15WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标main文件中的逻辑越来越多,考虑将其抽象出来,分成多个文件。hittable.rs可以相交的物体,抽象成一个接口。usecrate::ray::Ray;usec......
  • 【配电网重构】高比例清洁能源接入下计及需求响应的配电网重构【IEEE33节点】(Matlab代
    ......
  • 【python】函数重构
    函数重构函数重构pycharm函数重构步骤函数重构练习函数重构函数重构是指对现有函数进行修改和优化的过程。重构的目的是改善代码的可读性、可维护性和灵活性,同时保持其功能不变。函数重构通常包括以下步骤:理解函数的功能和目的。了解函数的作用和期望结果,确定重构......
  • 通过一个简单的案例,来谈谈代码的重构
    上伪代码:funca(){...order=***;payOrder=newv1{orderNo=order.orderNo,amt=order.amt,remark='结算资金下发'};//通过order得到v1;pay(payOrder);...}funcb(){...order=***;payOrder=newv1{orderNo=order.order......
  • 代码随想录算法训练营第六十三天 | prim算法、kruskal算法、复习
    53.寻宝—prim算法题目链接:https://kamacoder.com/problempage.php?pid=1053文档讲解:https://programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-prim.html思路本题是最小生成树的模板题,最小生成树可以使用prim算法,也可以使用kruskal算法计算出来。prim算......