reference:
http://en.wikipedia.org/wiki/Tarjan%27s_off-line_lowest_common_ancestors_algorithm
http://scturtle.is-programmer.com/posts/30055.html
算法流程:
1)读入表示父子关系的树
2)储存所有询问
3)一次DFS回答所有询问
算法的关键是:
对于一个正在访问中的节点u,其访问过的子树加上这个节点本身合并为一个等价类,等价类有一个代表元ancestor,值为u。对于u的一个未访问过的子节点v,如果属于询问 query(v, w)且w已访问过,则LCA(v,w) = ancestor[w]。
下图中,正访问到节点10
set1-4是目前的4个等价类
当 node 10 访问过后,set5 将会被合并到 set4 中,同样的,set3 会被合并到 set2 中。。。