首先,我们先来了解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)
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[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;
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;