tarjan求LCA學習筆記

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);
相關文章
相關標籤/搜索