1. 程式人生 > >[原創題] 樹上點到路徑的距離, 以及樹上路徑到路徑的距離

[原創題] 樹上點到路徑的距離, 以及樹上路徑到路徑的距離

技術分享 bsp left blog mage http img 現在 lca

  在學習平面幾何的時候, 我們介紹了點, 直線和圓, 隨後就研究了它們之間的一些數量關系.

  現在的載體變成了樹. 對於一棵樹, 我們定義了點和路徑, 那麽不妨可以研究一下點與點的距離, 點到路徑的距離, 路徑到路徑的距離.

點與點的距離

  $dist(x, y) = d[x] + d[y] - d[LCA(x, y)]$ .

    技術分享

點到路徑的距離

  定義 $dist(x, path(a, b)) = \min_{d \in path(a, b)} dist(x, d)$ .

  $dist(x, path(a, b)) = dist(x, a) + dist(x, b) - dist(a, b)$ .

    技術分享

路徑到路徑的距離

  定義 $dist(path(a, b), path(c, d)) = \min_{x \in path(a, b), y \in path(c, d)} dist(x, y)$ , 不妨記 $p = LCA(a, b), q = LCA(c, d)$ .

  當 $path(a, b)$ 與 $path(c, d)$ 相交時, $dist(path(a, b), path(c, d)) = 0$ .

  當 $path(a, b)$ 與 $path(c, d)$ 不相交, 且 $p$ 在 $q$ 子樹內時, 答案為 $dist(p, LCA(a, b))$ .

      技術分享

  當 $path(a, b)$ 與 $path(c, d)$ 不相交, 且 $q$ 在 $p$ 子樹內時, 答案為 $dist(q, LCA(c, d))$ .

  否則, 答案為 $dist(p, q)$ .

    技術分享

  綜上, 也可以表示為 $dist(path(a, b), path(c, d)) = \left\{ \begin{aligned} & 0 & , path(a, b) \cap path(c, d) \ne \emptyset \\ & \min(dist(p, LCA(c, d)), dist(q, LCA(a, b))) & , path(a, b) \cap path(c, d) \ne \emptyset \end{aligned} \right.$ 

[原創題] 樹上點到路徑的距離, 以及樹上路徑到路徑的距離