LCA做法RE了,无输出(哭死
查看原帖
LCA做法RE了,无输出(哭死
703319
Sylvia_starx楼主2023/10/18 18:44

求帮助。个人认为是pre_lca函数的问题捏(玄关

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n,q,dep[N],dp[N][30];
vector<int> nbr[N];
void pre_lca(int cur,int fa)
{
	dp[cur][0] = fa;
	dep[cur] = dep[fa] + 1;
	for(int i=1;(1<<i)<=dep[cur];i++)
		dp[cur][i] = dp[dp[cur][i-1]][i-1];
	for(int i=0;i<nbr[cur].size();i++)
	{			
		int nxt = nbr[cur][i];
		if(nxt != fa)
			pre_lca(nxt,cur);
	}
	return ;
}
int lca(int x,int y)
{
	if(dep[x] >= dep[y])
		swap(x,y);
	for(int i=20;i>=0;i--)
		if(dep[dp[y][i]] <= dep[x])
			y = dp[y][i];
	if(y == x)
		return y;
	for(int i=20;i>=0;i--)
		if(dp[y][i] != dp[x][i])
			y = dp[y][i],x = dp[x][i];
	return dp[x][0];
}
int getdis(int x,int y)
{
	return dep[x] + dep[y] - 2 * dep[lca(x,y)];
}
int main()
{
	cin>>n>>q;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		nbr[x].push_back(y);
		nbr[y].push_back(x);
	}
	pre_lca(1,0);
	for(int i=1;i<=q;i++)
	{
		int a,b,c,d;
		int p1 = lca(a,b),p2 = lca(c,d);
		bool f1 = getdis(a,p2) + getdis(b,p2) == getdis(a,b);
		bool f2 = getdis(c,p1) + getdis(d,p1) == getdis(c,d);
		if(f1 || f2)
			cout<<"Y\n";
		else
			cout<<"N\n";
	}
	return 0;
}
2023/10/18 18:44
加载中...