1. 程式人生 > >公共lca【Tarjan】

公共lca【Tarjan】

div gre col 方法 post color 公共祖先 com for

首先,我們先來了解LCA。

技術分享圖片

LCA 是樹上兩個點最近的公共祖先。

比如說,在如圖的樹中,3與4的公共祖先有“2”,“1”,但最近的祖先是“2”。

顯然,暴力可以做O(n),但是我們希望更快。

現在,有兩種方法:

  1)在線操作,但這需要“倍增”,再此不討論。

  2)離線操作,使用Tarjan與並查集。

先給出操作方法:

DFS (u)
for i in u.son
DFS(i)
UNION(u,i)
for i in u.e # e 表示 e 與訪問所有和u有詢問關系的i
if i.vis
(u,i).LCA = find
(i)

可以發現,操作是在深搜中進行的。下面開始模擬。

f[1]=1; vis[1]=0;
f[2]=2; vis[2]=0;
f[3]=3; vis[3]=0;
f[4]=4; vis[4]=0;
f[5]=5; vis[5]=0;
f[6]=6; vis[6]=0;

技術分享圖片

f[1]=1; vis[1]=0;
f[2]=2; vis[2]=0;
f[3]=3; vis[3]=0;
f[4]=4; vis[4]=0;
f[5]=5; vis[5]=0;
f[6]=6; vis[6]=0;

公共lca【Tarjan】