公共lca【Tarjan】
阿新 • • 發佈:2018-02-27
div gre col 方法 post color 公共祖先 com for
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[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。
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
可以發現,操作是在深搜中進行的。下面開始模擬。
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】