Tarjan求lca

一個優秀的求2點lca的離線算法
把所有詢問用前向星儲存
然後當dfs到x時,如果存在一個詢問(x,y)使得兩個點都被訪問過,那麼就將y的父親跳上去,直到不能跳爲止,這個點就是它們的lca
(等dfs某個點後再規定他的父親)
否則就標記
跳父親可用並查集的路徑壓縮

void dfs1(int x1)
{
    int i,y;
    bz[x1]=false;
    for (i=last2[x1];i>0;i=next2[i])
    {
        y=tov2[i];
        if (!bz[y])
        {
            ans[len2[i]]=getfather(y);//求答案
        }
    }
    for (i=last1[x1];i>0;i=next1[i])
    {
        y=tov1[i];
        if (bz[y])
        {
            dep[y]=dep[x1]+1;
            dfs1(y);
            fa[y]=getfather(x1);//定義父親
            father[y]=x1;
        }   
    }   
}
發佈了151 篇原創文章 · 獲贊 71 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章