https://www.luogu.com.cn/problem/P2590
#include<bits/stdc++.h>
#define int long long
using namespace std;
// const int Size=(1<<20)+1;
// char buf[Size],*p1=buf,*p2=buf;
// char buffer[Size];
// int op1=-1;
// const int op2=Size-1;
// #define getchar() \
// (tt == ss && (tt=(ss=In)+fread(In, 1, 1 << 20, stdin), ss == tt) \
// ? EOF \
// : *ss++)
// char In[1<<20],*ss=In,*tt=In;
inline int read()
{
int x=0,c=getchar(),f=0;
for(;c>'9'||c<'0';f=c=='-',c=getchar());
for(;c>='0'&&c<='9';c=getchar())
x=(x<<1)+(x<<3)+(c^48);
return f?-x:x;
}
inline void write(int x)
{
if(x<0) x=-x,putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
}
vector<int> E[1<<20];
void add(int u,int v) { E[u].push_back(v); }
int deep[1<<20],f[1<<20],siz[1<<20];
int son[1<<20],id[1<<20],rk[1<<20];
int root,op,cnt,top[1<<20];
int n,m;
void dfs1(int p,int fa)
{
siz[p]=1;
f[p]=fa;
deep[p]=deep[fa]+1;
int maxv=-1;
for(int i=0;i<E[p].size();i++)
{
int to=E[p][i];
if(to==fa) continue;
dfs1(to,p);
siz[p]+=siz[to];
if(siz[to]>maxv)
{
maxv=siz[to];
son[p]=to;
}
}
}
void dfs2(int p,int tp)
{
top[p]=tp;
if(!son[p]) return;
dfs2(son[p],tp);
for(int i=0;i<E[p].size();i++)
{
int to=E[p][i];
if(to==f[p]||to==son[p]) continue;
dfs2(to,to);
}
}
int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]>=deep[top[y]]) x=f[top[x]];
else y=f[top[y]];
}
return deep[x]<deep[y]?x:y;
}
// void add(int u,int v) { E[u].push_back(v); }
signed main()
{
n=read();
m=read();
root=read();
for(int i=1;i<n;i++)
{
int u=read(),v=read();
add(u,v);
add(v,u);
}
dfs1(root,0);
dfs2(root,root);
while(m--)
{
write(lca(read(),read()));
putchar('\n');
}
return 0;
}
以下是博客签名,正文无关
本文来自博客园,作者:Wy_x,转载请在文首注明原文链接:https://www.cnblogs.com/Wy-x/articles/18741648
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC-BY-NC-SA 4.0 协议)进行许可。

浙公网安备 33010602011771号