首页 > 其他分享 >相遇

相遇

时间:2023-10-29 09:59:13浏览次数:25  
标签:return int 城市 路径 相遇 dep railway

时间限制:1s

内存限制:256MB

【问题描述】

已知我国有 n 座城市,这些城市通过 n-1 条高铁相连。且任意两个城市联通。
小 A 想从 x1 号城市出发,到 y1 号城市,小 B 想从 x2 号城市出发,到 y2 号
城市,问他们是否可能在路途中相遇(出现在同一城市)
你需要回答 m 次这样的问题。

【输入】

输入文件名为 railway.in。
第一行一个数 T(<=10),表示数据组数
对于每一组数据:
第一行两个数 n,m(1<=n,m<=100,000)
第 2~n 行,每行两个数 x,y 表示有一条铁路连接城市 x 和 y
接下来 m 行每行四个数,分别表示 x1,y1,x2,y2,表示一次询问

【输出】

输出文件名为 railway.out。
对于每次询问输出 YES 或 NO

【输入输出样例】

railway.in railway.out

1
4 2
1 2
2 3
3 4
1 2 3 4
1 4 2 3
NO
YES

【数据说明】

对于 30%的数据,n,m<=100
对于 60%的数据,n,m<=1000
对于 100%的数据,n,m<=100,000


实际题意就是判断树上两条路径是否有交汇点。
路径a-b的LCA为e
路径c-d的LCA为f
如果有交汇点,那么e点在路径c-d上或f点在路径a-b上。
以点e在路径c-d上为例,那么e点在c-f上或在d-f上。
这样问题就变成了点z点是否在路径x-y上,其中y点为x的祖先。
那么只需要用深搜出现的次序就可以判断。
既l[x]<=l[z]<=l[y]且r[y]<=r[z]<=r[x]!


#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int t,n,m;

struct edge
{
	int u,v,nxt;
}e[maxn<<1];
int head[maxn],js;
void addage(int u,int v)
{
	e[++js].u=u;e[js].v=v;
	e[js].nxt=head[u];head[u]=js;
}
int lg[maxn];

int l[maxn],r[maxn],f[maxn][20],dep[maxn],cnt;
void init()
{
	js=0;cnt=0;
	memset(e,0,sizeof e);
	memset(head,0,sizeof head);
	memset(l,0,sizeof l);
	memset(r,0,sizeof r);
	memset(dep,0,sizeof dep);
	memset(f,0,sizeof f);
}
void dfs(int u,int fa)
{
	l[u]=++cnt;
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=1;f[u][i-1]&&i<20;++i)
		f[u][i]=f[f[u][i-1]][i-1];
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==fa)continue;
		dfs(v,u);
	}
	r[u]=++cnt;
}
int lca(int u,int v)
{
	if(dep[v]>dep[u])swap(u,v);
	while(dep[u]>dep[v])u=f[u][lg[dep[u]-dep[v]]];
	if(u==v)return u;
	for(int i=19;i>=0;--i)
	{
		if(f[u][i]!=f[v][i])
		{
			u=f[u][i];v=f[v][i];
		}
	}
	return f[u][0];
}
bool zai(int a,int b,int c)
{
	return l[b]<=l[a]&&l[a]<=l[c]&&r[c]<=r[a]&&r[a]<=r[b];
}
int main()
{
	freopen("railway.in","r",stdin);
	freopen("railway.out","w",stdout);
	scanf("%d",&t);
	lg[0]=-1;
	for(int i=1;i<=100000;++i)lg[i]=lg[i/2]+1;
	while(t--)
	{
		init();
		scanf("%d%d",&n,&m);
		for(int u,v,i=1;i<n;++i)
		{
			scanf("%d%d",&u,&v);
			addage(u,v);
			addage(v,u);
		}
		dfs(1,0);
		for(int a,b,c,d,e,f,i=0;i<m;++i)
		{
			scanf("%d%d%d%d",&a,&b,&c,&d);
			e=lca(a,b);
			f=lca(c,d);
			if(zai(f,e,a)||zai(f,e,b)||zai(e,f,c)||zai(e,f,d))puts("YES");
			else puts("NO");
		}
		
	}
	return 0;
}

标签:return,int,城市,路径,相遇,dep,railway
From: https://www.cnblogs.com/gryzy/p/17795481.html

相关文章

  • 醇音典范 一脉相承! 第五届中国(北京)国际耳机展,索尼期待与你相遇
    2023年8月26日至8月27日,第五届中国(北京)国际耳机展将在北京亚洲大酒店盛大开启。索尼音频产品秉持"FortheMusic"品牌理念,借助四十余年浸润音乐领域的技术深耕和产业积累,构筑了从声音的录制、制作、到播放、聆听的完整产业链。凭借不断革新、引人注目的产品和技术,索尼致力于构建创......
  • 我们有相遇的时间(time)
    终于还是写到这个了。。。题意:一个平面直角坐标系上,给你六个点,分别是\((0,0),(0,1),(1,0),(1,1),(0,0.5),(1,0.5)\)。你随时可以做两种操作,第一种是选两个点的编号,在这两个点之间得到一条直线,这条直线的编号为上个直线编号加一,第二种选两条有交直线,并得到交点,交点编号为上个点......
  • 不同起点转角相遇,从抖音和小红书看「社区产品」宿命 | 融云观察
    作为社交产品全球热点,Threads偷袭Twitter以及由此升级的马斯克和扎克伯格约架给全球用户上演了一出好戏。关注【融云全球互联网通信云】了解更多别打啦~马斯克直接在新闻下面回复“竞争可以,作弊不行”。不过,现实可能是另一个故事,作弊行不行得通,要看用户买不买账。“复刻”这招对......
  • Solution Set - “一二行诗句相遇,十万颗恒星解体”
    目录0.「集训队互测2018」Fim4⭐1.「ABC294Ex」K-Coloring⭐2.「NOISimu.」解码3.「NOISimu.」图⭐4.「NOISimu.」表达式5.「ULR#1」「UOJ#577」打击复读⭐6.「UR#7」「UOJ#84」水题走四方⭐7.「UR#8」「UOJ#118」赴京赶考8.「UR#8」「UOJ#119」决战圆锥曲线9.......
  • 相遇的魔咒
    ^^^^^^相遇一定是一种魔咒,让我甘于被你看守记得当初你的一举一动,记得你阳光般的温柔重逢是魔咒中的魔咒,让我再也无法回头从此跟著你的身影旋转,时而快乐时而忧愁你成为我的幸运我的主宰,你医治我心上所有的伤口为了你我将充满笑容,报答你在我身边扮演小丑每当我掉下眼泪的时候,......
  • 【Python21天学习挑战赛】—Day1:学习规划,我与python的相遇
    大学实验室指导老师说过:“学习是无聊的。没有人说学习是快乐的,那是扯淡!”。是的,学习是无聊的,但是学习到的知识丰富我们自己是快乐的。我喜欢把自己每天所学的知识通过平台分......
  • 新的一年,写给岁月,写给你,感恩相遇,未来可期
    岁月是年轮,刻下深浅不一的痕迹,这一路上,走过风雨,走过四季,走经过春夏秋冬的又一个轮回。时间不语,放任日子悄悄溜走,岁月不居,任凭年龄在增长。那些悄无声息的日子,就......
  • 两个人从不同点出发,然后相遇的最短路问题
    MovingBothHands//可以选择一个中转点//也就是先正着走到这个点//然后再从这个点开始反着走//但是如果已经开始反着走了,那就只可以反着走图//正着和反着跑,有点奇......
  • 洛谷P4320 道路相遇(LCA+圆方树)
    题目链接:https://www.luogu.com.cn/problem/P4320道路相遇题目描述在H国的小w决定到从城市$u$到城市$v$旅行,但是此时小c由于各种原因不在城市$u$,但是小c决......
  • 有环快慢指针相遇问题
    quick快指针速度Vq=2Vs,slow慢指针速度Vs,首先在环内一定会相遇这里就不阐述了;(借用下别人的图(谢谢那位))背景:环的起点为X,从链表到X的距离为x,假设quick和slow在Z点相遇,且X到......