hdu 2586 How far away ? (tarjan算法求LCA模板题)

题目链接
题意:一棵树,给出n-1个边权,然后q组查询,每组查询询问两个点之间的距离。
思路:

dfs跑出根到每个点的距离,设为dis[i]
那么u,v两点的距离就是ans = dis[u]+dis[v]-2*dis[lca(u,v)];

其中lca(u,v)为u,v的最近公共祖先。 这个式子是利用容斥,其实也很直观。。不理解的话画个图就好。

所以终点就是求两个点的LCA.

据说有好多种做法。今天学习了大概是最简单的一种?
学习链接

 

我的理解:其实本质就是利用并查集。。在访问一个点的子树的时候,这个点其所有子树的祖先。。。由于祖先的节点比较小,所以merge的时候要f[大]=小…

要注意Tarjan 算法是离线算法。

哦对了。。这题要扩展语句才能过,不然会RE…

 

 

作者: CrazyKK

ex-ACMer@hust,stackoverflow-engineer@sensetime

说点什么

您将是第一位评论人!

提醒
wpDiscuz