LCA
思路一:暴力算法(会T3个点),直接从需要搜索的点向上,并将路径记录下来,再进行对比即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=500000+5;
vector<int>e[maxn];
int d[maxn],f[maxn];
void dfs(int x,int fa){
d[x]=d[fa]+1;//x的深度为他的父亲节点的深度加一
f[x]=fa;//设置他的父亲节点
for(int i=0;i<e[x].size();i++){
int y=e[x][i];//存下一个子节点
if(y!=fa)//不能搜他的父亲节点
dfs(y,x);//从y点开始,x为父亲节点,继续搜索
}
}
int main(){
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);//读入
e[x].push_back(y);//存图
e[y].push_back(x);
}
dfs(s,0);//开始搜索
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
if(d[x]<d[y]){//调整到同一高度
int tmp=x;
x=y;
y=tmp;
}
while(d[x]>d[y]){//比较节点深度
x=f[x];
}
while(x!=y){//如果两点不同
x=f[x];
y=f[y];
}
printf("%d\n",x);//输出
}
return 0;
}