首页 > 其他分享 >Z2219. [ABC235E] MST + 1

Z2219. [ABC235E] MST + 1

时间:2023-10-11 21:46:57浏览次数:45  
标签:iy ix int MST ABC235E jump dep Z2219 ans

 

 

先写一发LCA

#include<bits/stdc++.h>
using namespace std;
int n,q,x,y,dep[500005],jump[500005][22];
vector<int>d[500005];
void findep(int p,int f,int dp)
{
	dep[p]=dp; //点p的深度为dp 
	for(int i=0;i<=int(d[p].size()-1);i++)
		if(d[p][i]!=f)
		{
			int pn=d[p][i];
            jump[pn][0]=p; //pn向上跳2^0即1步的时候,就是它的父亲点 
			findep(pn,p,dp+1);
		}
	return ;
}
int lca(int ix,int iy)
{
	if(dep[ix]<dep[iy])
	//规定ix是深度较大的点 
		swap(ix,iy);
	for(int i=20;i>=0;i--)
	//一定是倒过来循环 
		if(dep[jump[ix][i]]>=dep[iy])
		//如果一直跳在iy的下方,才能跳 
			ix=jump[ix][i];
	if(ix==iy) //如果重合,就出结果了 
		return ix;
	for(int i=20;i>=0;i--)
	//又是倒过来循环 
		if(jump[ix][i]!=jump[iy][i])
		//所跳的点,必须是两个不同的点 
		{
			ix=jump[ix][i];
			iy=jump[iy][i];
		}
	return jump[ix][0];  //ix的父亲点即是结果 
}
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n-1;i++)
	{
		scanf("%d%d",&x,&y);
		d[x].push_back(y);
		d[y].push_back(x);
	}
	findep(1,0,1);
	for(int i=1;i<=20;i++)
		for(int j=1;j<=n;j++)
			jump[j][i]=jump[jump[j][i-1]][i-1];
	for(int i=1;i<=q;i++)
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",lca(x,y));
	}
	return 0;
}

  

 

再改一下,求出树上任两点之间的最长边

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,M=N*2;
int n,m,q;
struct edge
{
	int u,v,w;
	bool operator<(const edge &x)	const
	{
		return w<x.w;
	}
}ed[N];
int fa[N];
int h[N],e[M],ne[M],w[M],tot;
int f[N][22],g[N][22],dep[N];
int find(int x)
{
	if(fa[x]==x)	
	   return x;
	return fa[x]=find(fa[x]);
}
void add(int a,int b,int c)
{
	e[++tot]=b;w[tot]=c;ne[tot]=h[a];h[a]=tot;
}
void dfs(int x,int FA,int d)
//x表示在哪个点,fa是它父亲点,d是深度 
{
	dep[x]=d;
	f[x][0]=FA;
	for(int i=h[x];i;i=ne[i])
	{
		int j=e[i];
		if(j==FA)	continue;
		g[j][0]=w[i];
		dfs(j,x,d+1);
	}
}
int get_lca(int a,int b)
{
	if(dep[a]<dep[b])	
	   swap(a,b);
	//规定a是深度较大的 
	int ans=0;
	for(int i=20;i>=0;i--)
		if(dep[f[a][i]]>=dep[b])
		{
			ans=max(ans,g[a][i]);
			a=f[a][i];
		}
	if(a==b)
	  	return ans;
	for(int i=20;i>=0;i--)
		if(f[a][i]!=f[b][i])
		{
			ans=max(ans,max(g[a][i],g[b][i]));
			a=f[a][i];
			b=f[b][i];
		}
	return max(ans,max(g[a][0],g[b][0]));
}

signed main()
{
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&ed[i].u,&ed[i].v,&ed[i].w);
	sort(ed+1,ed+1+m);
	for(int i=1;i<=n;i++)	fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		int a=find(ed[i].u),b=find(ed[i].v);
		if(a==b)	continue;
		fa[a]=b;
		add(ed[i].u,ed[i].v,ed[i].w);
		add(ed[i].v,ed[i].u,ed[i].w);
	}
	dfs(1,0,1);
	for(int i=1;i<=20;i++)
	for(int j=1;j<=n;j++) 
	{
		f[j][i]=f[f[j][i-1]][i-1];
		g[j][i]=max(g[j][i-1],g[f[j][i-1]][i-1]);
	}
	for(int i=1;i<=q;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		int lca=get_lca(a,b);
		if(lca>c)	
		    printf("Yes\n");
		else 
		    printf("No\n");
	}
	return 0;
}

  

 

NOIP模板题--货车运输

标签:iy,ix,int,MST,ABC235E,jump,dep,Z2219,ans
From: https://www.cnblogs.com/cutemush/p/17758257.html

相关文章

  • 楼宇暖通采集网关BACnet MSTP协议采集
    楼宇自动化在现代建筑中扮演着重要的角色,它可以集成和控制各种设备和系统,提高建筑的能效和舒适性。然而,不同的设备和系统通常使用不同的通信协议,这给楼宇自动化的实施带来了一定的挑战。为了解决这个问题,BACnet和Modbus成为了两种常用的通信协议。BACnet是楼宇自动化领域的通信协议......
  • Kali使用zsteg出现"stack level too deep (SystemStackError)"报错!
    前段时间用VM虚拟机直接安装在kali官网下载的虚拟机镜像系统之后,安装完zsteg使用的时候出现"stackleveltoodeep(SystemStackError)"报错。在百度搜索许久也没有找到具体的解决方法,后来在Github里面发现也有人遇到了这个情况,并且提交了Issues。进Issues里面看了眼发现有人......
  • 每天一个linux命令(46):vmstat命令
    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat 工具提供了一种低开销的系统性能观察方式。因为 vmstat 本身就是低开销工具,在非常高负......
  • MSTP配置实例
    需求与分析 1、sw1、sw2、sw3、sw4全部运行mstp系统视图下:stpenablestpmodemstp2、MSTP的regionname氏huawei, revision-level为12系统视图下stpregion-configurationregion-namehuaweirevision-level12instance10vlan10instance20vlan20activeregion......
  • 网络安全-修改基础接口配置(MSTP负载均衡)
    [s3-GigabitEthernet0/0/1]disthis#interfaceGigabitEthernet0/0/1portlink-typeaccessportdefaultvlan10#return[s3-GigabitEthernet0/0/1]portde [s3-GigabitEthernet0/0/1]portdefaultvlan1\^Error:Wrongparam......
  • AT_codefestival_2016_qualB_c Gr-idian MST
    思路首先想到暴力建边跑最小生成树,但是显然会TLE。所以思考有没有时间复杂度更低的做法,考虑到最小生成树是每次取最短的边,所以我们也可以先考虑较短的边。首先最短的边一定是某一列或者某一行(或者若干列和行),所以我们取边,也应该是一行一行或者一列一列的取。但是有些时候这样......
  • MST 题单
    ……好多题单的题目都没补掉捏(如何求MSTKruskalMST就是最小生成树啦~然后我发现自己最小生成树学的也不好,连夜加急八百里复习了kruskal和Prim。下面简单来讲讲这两个算法吧awa。Kruskal是非常简单的算法,它是怎么做的嘞?首先对所有边按照边权从大到小排个序,然后每次取出......
  • 教程:开始使用 Microsoft Sentinel 中的 Jupyter Notebook 和 MSTICPy——威胁狩猎用,含
    教程:开始使用MicrosoftSentinel中的JupyterNotebook和MSTICPy项目2022/05/026个参与者  备注AzureSentinel现在称为MicrosoftSentinel,我们将在几周内更新相关页面。详细了解最近的Microsoft安全性增强。本教程介绍如何运行“MicrosoftSentinelMLNotebook入门......
  • Linux系列---【CentOS 7通过MSTSC连接远程桌面】
    安装对应的yum源yumlistlightdmxorgxrdpxrdp可以看到这些软件都在epel中,如果没有的话,请先安装对应的yum源。命令如下:yuminstall-yepel-release确认yum源没有问题之后,我们就可以进行安装了。安装lightdmxorgxrdpxrdplightdm提供了图形登录界面和用户会话管理......
  • ubuntu云服务器通过mstsc远程登录
    安装一个轻量级桌面环境,并实现通过Windows11的远程桌面服务访问,以及将所需的服务添加到开机自启,可以按照以下步骤进行操作:首先,通过SSH登录到云服务器。可以使用终端或PuTTY(Windows用户)等工具进行SSH登录。安装轻量级桌面环境,推荐使用Xfce桌面环境。运行以下命令......