1. 程式人生 > >LCA(最近公共祖先)離線演算法Tarjan

LCA(最近公共祖先)離線演算法Tarjan

對於5的每個兒子,LCA,先LCA(1)1沒有兒子,跳過第一個for,然後,visit[1]=true;查詢的vector(vector來記錄這個樹和查詢比較好,空間效率比較高),有一組(1,5),可是visit[5]現在仍然是初始值false

然後,退出1LCA,回到5LCA,此時,進行5的第二個兒子44沒有兒子,跳過第一個for,然後visit[4]=true;查詢中有三組與4有關的,而只有1被訪問過了,那麼,ancestor(1,4)=father[getfather[1]]=5

退出4LCA,回到5的,進行5的第三個兒子2,2有一個兒子,進入3LCA

3沒有兒子,visit[3]=true;

然後有三組查詢與3有關,其中,1,4都訪問過了,注意,2還沒有訪問,因為我們進入了LCA(2)的第一個for迴圈,而且,1,4此時的祖先都是5,那麼,ancestor(3,1)=5;ancestor(3,4)=5;注意,此時,3的祖先仍是初始的他自己,如果1還有兒子,而查詢的是1的兒子和3的話,1的兒子會被路徑壓縮,其祖先變成1的祖先5

退出3LCA,回到2的,而且把3union2上了,visit[2]=true;查詢中有兩組記錄與2有關,而且都已經訪問過了,那麼,也很同之前一樣,得出結果。

退出2LCAvisit[5]=true;還有一個關於5的查詢,不再贅述。

程式結束。