离线求lca模板

来源:互联网 发布:苹果6s数据参数设置 编辑:程序博客网 时间:2024/05/17 02:14

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;
}
}

}


 
0 0
原创粉丝点击