tarjan离线求 lca ,dfs+并查集 复杂度 n +q
int fa[maxn],head[maxn];
int qhead[maxn];//询问的链表头struct node{
int to,next,lca;
};
node edge[maxn],qedge[maxq];//用链表记录询问,加双向,初值k=0
bool vist[maxn];
int find(int x){
if(fa[x]!=x) return fa[x]=find(fa[x]);
return fa[x];
}
void tarjan_lca(int u){
fa[u]=u;
vist[u]=true;
for(int k=head[u];k!=-1;k=edge[k].next){
v=edge[k].to;
if(!vist[v]){
tarjan_lca(v);
fa[v]=u;
}
}
for(int k=qhead[u];k!=-1;k=qedge[k].next){
int v=qedge[k].to;
if(vist[v]){
qedge[k].lca=find(v);
qedge[k^1].lca=qedge[k].lca;
}
}
}