玄学?
查看原帖
玄学?
305069
_awa_wangjiawen楼主2024/7/5 14:53

用同一份代码交了几遍,结果都不一样。

#include<bits/stdc++.h>
using namespace std;
struct node{
	int son;
}; 
vector<node>g[500001];
int n,m,l,maxn=-1;
int f[500001][20];
int d[500001];
int xx[500001],yy[500001];
bool flag[500001];
void D(int s)
{
	if(flag[s]==1)
		return ;
	flag[s]=1;
	for(int i=0;i<g[s].size();i++)
		if(flag[g[s][i].son]==0)
		{
			d[g[s][i].son]=d[s]+1;
			maxn=max(maxn,d[s]+1);
			D(g[s][i].son);
		}
	return ;
}
void ST()
{
	for(int j=1;j<=ceil(log2(maxn));j++)
		for(int i=1;i<=n;i++)
			f[i][j]=f[f[i][j-1]][j-1];
	return ;
}
void LCA(int x,int y)
{
	if(d[x]>d[y])
		swap(x,y);
	for(int i=ceil(log2(maxn));i>=0;i--)
		if(d[f[y][i]]>=d[x])
			y=f[y][i];
//	cout<<x<<" "<<y<<endl;
	if(x==y)
	{
		cout<<x<<endl;
//		cout<<endl;
		return ;
	}
	for(int i=ceil(log2(maxn));i>=0;i--)
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];y=f[y][i];
		}
	cout<<f[x][0]<<endl;
//	cout<<endl;
	return ;
}
node eg;
int main()
{
	cin>>n>>m>>l;
	d[l]=1;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;xx[i]=x;yy[i]=y;
		eg.son=x;
		g[y].push_back(eg);
		eg.son=y;
		g[x].push_back(eg);
	}
	D(l);
	for(int i=1;i<n;i++)
	{
		if(d[xx[i]]>d[yy[i]])
			f[xx[i]][0]=yy[i];
		else
			f[yy[i]][0]=xx[i];
	}
	ST();
//	cout<<endl;
//	for(int i=1;i<=n;i++)
//		cout<<d[i]<<" ";
//	cout<<endl<<endl;
//	for(int i=1;i<=n;i++)
//	{
//		for(int j=1;j<=ceil(log2(maxn));j++)
//			cout<<f[i][j]<<" ";
//		cout<<endl;
//	}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		LCA(x,y);
	}
	return 0;
}

1 2 3 4 5 AC

2024/7/5 14:53
加载中...