1.求树上两点距离
dis(a,b)=dis(a,root)+dis(b,root)-2*dis(lca(a,b),root)
2.求树上到达三点距离之和最小的点(重复路径重复计算)
t=lca(a,b)^lca(b,c)^lca(c,a)
ans=d(t,a)+d(t,b)+d(t,c)
注:到达树上三点距离之和的点只有一个。证明如下:
先考虑其中两点,如果另一点在该连线上,那么答案只有该点,如果不再该连线上,那么答案就是另一点到达该线最短距离的交点,也只有一点。
3.求树上三点相连后的最短距离(与2不同,重复路径计算一次即可)
ans=(dis(a,b)+dis(b,c)+dis(c,a))/2
4.寻找树上到x点距离严格小于到达y和z点距离的点的总数
1)求
<x,y>
<script type="math/tex" id="MathJax-Element-7">
</script>和
<x,z>
<script type="math/tex" id="MathJax-Element-8">
</script>的中点z1,z2
2)讨论z1,z2和x的位置关系求解
5.求在一颗树上填边后桥的数量。
未添边时,桥为n-1,添边后桥的数量减少该两点树中路径长度的数量,但是可能出现重叠的情况因此需要记录当前点是否已经属于某个非桥环。
所以每条边最多遍历一次,总复杂度不超过O(n)