求救
查看原帖
求救
346389
Windows_Vista150楼主2020/5/17 20:01
#include<cmath>
#include<stack>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
struct TREE
{
	int pre;
	int to;
}tree[500010];
int edge_sum,head[500010];
int N,M,S,parent[30][500010],depth[500010];
void add_edge(int from,int to)
{
	edge_sum++;
	tree[edge_sum].pre=head[from];
	tree[edge_sum].to=to;
	head[from]=edge_sum; 
}
void dfs(int dep,int cur,int fa)
{
	depth[cur]=dep;
	parent[0][cur]=fa;
	for(int i=head[cur];i!=0;i=tree[i].pre)
	{
		int u=tree[i].to;
		if(u!=fa)dfs(dep+1,u,cur);
	}
}
int query_LCA(int u,int v)
{
	if(depth[u]<depth[v])swap(u,v);
	if(depth[u]!=depth[v])
		for(int k=log(N)/log(2);k>=0;k--)
			if(depth[u]+(1<<k)<=depth[v])u=parent[k][u];
	if(u==v)return u;
	for(int k=log(N)/log(2);k>=0;k--)
		if(parent[k][u]!=parent[k][v])
			u=parent[k][u],v=parent[k][v];
	return parent[0][u];
}
int main()
{
	cin>>N>>M>>S;
	for(int i=1;i<=N-1;i++)
	{
		int u,v;
		cin>>u>>v;
		add_edge(u,v);
		add_edge(v,u);
	}
	dfs(1,S,S);
	for(int k=1;k<=log(N)/log(2);k++)
		for(int v=1;v<=N;v++)
			parent[k][v]=parent[k-1][parent[k-1][v]];
	for(int i=1;i<=M;i++)
	{
		int u,v;
		cin>>u>>v;
		cout<<query_LCA(u,v)<<endl;
	}
	return 0;
}

倍增的 2020

2020/5/17 20:01
加载中...