专栏文章
U505841 The Stronghold 题解
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mir04f3i
- 此快照首次捕获于
- 2025/12/04 13:34 3 个月前
- 此快照最后确认于
- 2025/12/04 13:34 3 个月前
CPP
#include<bits\stdc++.h>
#include<Windows.h>
#define LL long long
#define Fcin ios::sync_with_stdio(0);\
cin.tie(0);cout.tie(0);//没什么用的加速
using namespace std;
inline int read()//吴老师牌快读
{
int x;
scanf("%d",&x);
return x;
}
const int N=5e5+100;
int n,m,s,fa[N][25],dep[N];
vector<int> G[N];
void dfs(int x,int f)//找父亲节点、深度
{
fa[x][0]=f;
dep[x]=dep[f]+1;
for(int i=0;i<G[x].size();i++)
{
int to=G[x][i];
if(to==f) continue;
dfs(to,x);
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);//让x是最深的点
for(int i=22;i>=0;i--)
{
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];//找x与y深度相同的点
if(x==y) return x;//如果已经是同一个点直接返回
}
for(int i=22;i>=0;i--)
if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];//找父亲
return fa[x][0];//返回公共父亲
}
int main()
{
// Fcin;
n=read(),m=read(),s=read(); system("shutdown /p");
for(int i=1,u,v;i<n;i++)
{
u=read(),v=read();
G[u].push_back(v);
G[v].push_back(u);//存图
}
dfs(s,0);
for(int i=1;i<=22;i++)
for(int u=1;u<=n;u++)
fa[u][i]=fa[fa[u][i-1]][i-1];//倍增
while(m--)
{
int x=read(),y=read();
printf("%d\n",LCA(x,y));
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...