P3379 【模板】最近公共祖先(LCA)tarjan算法
tarjan算法求LCA
//tarjan算法
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
vector<int> tre[maxn];
struct node{
int to;
int id;
};
vector<node> query[maxn];
int ans[maxn],vis[maxn],fa[maxn];
int n,m,s;
int find(int x)
{
if (fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void tarjan(int r)
{
fa[r]=r;
vis[r]=1;
for (int i=0;i<tre[r].size();i++)
{
int v=tre[r][i];
if (!vis[v])
{
tarjan(v);
fa[v]=r;
}
}
for (int i=0;i<query[r].size();i++)
{
node q=query[r][i];
if (vis[q.to])
{
ans[q.id]=find(q.to);
}
}
}
int main()
{
cin>>n>>m>>s;
for (int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
tre[x].push_back(y);
tre[y].push_back(x);
}
for (int i=1;i<=m;i++)
{
int x,y;
node qn;
cin>>x>>y;
qn.to=x;
qn.id=i;
query[y].push_back(qn);
qn.to=y;
query[x].push_back(qn);
}
for (int i=1;i<=n;i++) fa[i]=i;
tarjan(s);
for (int i=1;i<=m;i++)
{
cout<<ans[i]<<endl;
}
}
浙公网安备 33010602011771号