求助,样例过了但爆零
查看原帖
求助,样例过了但爆零
349581
qytqytqy楼主2021/8/9 17:56

RT

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<memory.h>
#include<queue>
using namespace std;
int i,n,idx,k,m,l,o,p;
int h[500005],e[500005],ne[500005];
int depth[500005],fa[500005][20]={{0}};
void add(int x,int y)
{
	e[idx]=y;
	ne[idx]=h[x];
	h[x]=idx++;
}
void bfs(int root)
{
	memset(depth,0x3f3f3f3f,sizeof(depth));
	depth[root]=1;
	depth[0]=0;
	queue<int> q;
	q.push(root);
	while(q.size())
	{
		int t=q.front();
		q.pop();
		for(i=h[t];i!=-1;i=ne[i])
		{
			int j=e[i];
			if(depth[j]>depth[t]+1)
			{
				depth[j]=depth[t]+1;
				q.push(j);
				fa[j][0]=t;
				for(k=1;k<=20;k++) fa[j][k]=fa[fa[j][k-1]][k-1];
			}
		}
	}
}
int lca(int x,int y)
{
	if(depth[x]<depth[y]) swap(x,y);
	for(register int j=20;j>=0;j--) 
	if(depth[fa[x][j]]>=depth[y]) x=fa[x][j];
	if(x==y) return x;
	for(register int j=20;j>=0;j--)
	{
		if(fa[x][j]!=fa[y][j])
		{
			x=fa[x][j];
			y=fa[y][j];
		}
	}
	return fa[x][0];
}
int dist(int xx,int yy)
{
	int ll=lca(xx,yy);
	return abs(depth[ll]-depth[xx])+abs(depth[ll]-depth[yy]);
}
int main()
{
	memset(h,-1,sizeof(h));
	memset(ne,-1,sizeof(ne));
	cin>>n>>m;
	for(i=1;i<n;i++)
	{
	    int x,y;
	    cin>>x>>y;
	    add(x,y);
	    add(y,x);
	}
	bfs(1);
	while(m--)
	{
		int a=0,b=0,c=0,d=0;
		cin>>a>>b>>c>>d;
		cout<<lca(a,b)<<' '<<lca(c,d)<<endl<<endl;
		if((dist(a,b)+dist(c,d))>=(dist(a,c)+dist(b,d))) cout<<'Y'<<endl;
		else cout<<'N'<<endl;
	}
	return 0;
}
2021/8/9 17:56
加载中...