tarjan求LCA学习笔记

允我心安 提交于 2019-12-02 07:53:59

tarjan求LCA学习笔记

其实,实质就是离线处理询问,
我们可以将所有询问看成类似于这样的样子,
(图之后再补上)
每次提高LCA,当两点恰好连通时,两点之间最高的点就为LCA。
具体实施:
每次dfs搜索所有子树,搜索完后将子树内所有点的父亲标为祖辈中连通的最高点,搜到询问点时,若另一点已经搜过,LCA就为它祖辈中连通的最高点。
(图之后再补上)

void tarjan(int x,int fa){
    int v;
    for(int i=head[x];i;i=e[i].nxt) if(e[i].to!=fa) tarjan(e[i].to,x),f[e[i].to]=x;
    for(int i=head2[x];i;i=q[i].nxt){
        v=q[i].to;
        if(book[v]) lca[q[i].w]=getf(v);
    } 
    book[x]=1;
}
for(int i=1;i<=m;++i){
        t1=read(),t2=read(),que[i].x=t1,que[i].y=t2;
        if(t1==t2){lca[i]=t1; continue;}
        add(t1,t2,i,q,head2),add(t2,t1,i,q,head2);
    }
    tarjan(1,0);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!