hihocoder#1541 : 相交的铁路线

#1541 : 相交的铁路线

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

H国有 n 个城市,编号1..n。城市间有n-1条铁路,保证任意两个城市可以通过铁路互达,且路线唯一。

现有 m 次询问,每次询问两条铁路线是否相交(有共同经过的城市或铁路)。

输入

第一行一个数 T,表示数据组数

对于每一组数据:

第一行两个数n, m

第2~n行,每行两个数x, y表示有一条铁路连接城市 x 和 y

接下来m行每行四个数,x1, y1, x2, y2 表示询问城市 x1 和 y1 之间的路线是否和城市 x2 和 y2 之间的路线相交。

对于40%的数据,1 ≤ n, m ≤ 100  

对于60%的数据,1 ≤ n, m ≤ 1000

对于100%的数据,1 ≤ T ≤ 10, 1 ≤ n, m ≤ 100000 1 ≤ x, y, x1, y1, x2, y2 ≤ n

输出

对于每次询问输出YES或NO

样例输入

1
4 2
1 2
2 3
3 4
1 2 3 4
1 4 2 3

样例输出

NO
YES

EmacsNormalVim

题解:

emm,我们定义x1,y1的lca为t1,x2,y2的lca为t2,不难发现,如果要有相交,t1和t2一定是祖孙关系(不是祖孙关系即不在同一颗子树内,显然这样永远也不会相交)。

那么这样就好办了。分类讨论一下,当t1为t2的祖先,那么满足lca(t2,x1)==t2||lca(t2,y1)==t2即有相交(表示t2位于x1到t1的路径上或位于y1到t1的路径上)。t2为t1祖先亦然。

代码(打起来还是很容易的):

#include<bits/stdc++.h>
using namespace std;
int n,m,tot,e[500001],head[500001],nexr[500001],dep[500001],f[100001][21];
void build(int t,int k){
	tot++;
	e[tot]=k;
	nexr[tot]=head[t];head[t]=tot;
}
void dfs(int x,int fa){
	int i;
	for(i=head[x];i;i=nexr[i]){
		if(e[i]==fa)continue;
		dep[e[i]]=dep[x]+1;
		f[e[i]][0]=x;
		dfs(e[i],x);
	}
}
int lca(int x,int y){
	int i;
	//printf("%d %d ",x,y);
	if(dep[x]<dep[y])swap(x,y);
	for(i=20;~i;i--)
	 if(dep[f[x][i]]>=dep[y])x=f[x][i];
	//printf("%d\n",x); 
	if(x==y)return x;
	for(i=20;~i;i--)
	 if(f[x][i]!=f[y][i]){
	 	x=f[x][i];y=f[y][i];
	 }
	return f[x][0]; 
}
int main(){
	int i,j,t,k,t3,t1,t2,x1,y1,x2,y2;
	scanf("%d",&t3);
	while(t3--){
		scanf("%d%d",&n,&m);
		tot=0;
		memset(head,0,sizeof(head));
		for(i=1;i<n;i++){
			scanf("%d%d",&t,&k);
			build(t,k);
			build(k,t);
		}
		dep[1]=1;
		memset(f,0,sizeof(f));
		dfs(1,-1);	
	for(j=1;j<=20;j++)
	 for(i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1]; 
	while(m--){
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		t1=lca(x1,y1);t2=lca(x2,y2);
		//printf("%d %d %d\n",t1,t2,lca(t1,t2));
		if(lca(t1,t2)==t1){
			if(lca(t2,x1)==t2||lca(t2,y1)==t2)puts("YES");
			 else puts("NO");
		}
		 else if(lca(t1,x2)==t1||lca(t1,y2)==t1)puts("YES");
		  else puts("NO");
	}
}
}

猜你喜欢

转载自blog.csdn.net/qq_41510496/article/details/81294686