Tarjan算法求LCA板子
离线算法:适用于无向图,(query建无向边)
利用并查集+DFS
时间复杂度O(n+m)
vector<int>e[maxn];
vector<pii>query[maxn];
int fa[maxn],vis[maxn],ans[maxn];
int find(int u){
if(u==fa[u])return u;
if(fa[u]!=u){
fa[u]=find(fa[u]);
}
return fa[u];
}
void tarjan(int u){
vis[u]=1;
for(auto v:e[u]){
if(!vis[v]){
tarjan(v);
fa[v]=u;
}
}
for(auto q:query[u]){
int v=q.fi,i=q.se;
if(vis[v]){
ans[i]=find(v);
}
}
}