POJ 2763"Housewife Wind"(DFS序+樹狀數組+LCA)

 

傳送門git

 

•題意

  一對夫婦居住在 xx村莊,給村莊有 $n$ 個小屋;github

  這 $n$ 個小屋之間有雙向可達的道路,不會出現環,即所構成的圖是個樹;數組

  從 $a_i$ 小屋到 $b_i$ 小屋須要花費 $w_i$ 時間;3d

  初始,女主角在 $s$ 號小屋,有 q 次詢問,每次詢問爲如下兩種的一個:code

    • 0 u : 她有個孩子在 $u$ 號屋,須要媽媽接她回家,輸出從 $s$ 到 $u$ 的最短期
    • 1 x val : 因爲種種緣由,第 $x$ 條道路的耗時由以前的 $w_x$ 變爲了 $val$

•題解

  考慮如圖所示的結構,在樹上操做有些不便之處,因此,咱們須要將其序列化;blog

  將上圖所示的樹,將其轉化成 DFS序;ci

  $1\overset{w_{1,2}}{\rightarrow} 2 \overset{w_{2,4}}{\rightarrow} 4 \overset{-w_{2,4}}{\leftarrow} 2\overset{w_{2,5}}{\rightarrow}5\overset{-w_{2,5}}{\leftarrow}2\overset{-w_{1,2}}{\leftarrow}1\overset{w_{1,3}}{\rightarrow}3\overset{-w_{1,3}}{\leftarrow}1$get

  並令權重沿葉子方向爲正,沿根方向爲負;it

  那麼從 $u$ 第一次出現的位置到 $v$ 第一次出現的位置中,不屬於 $u,v$ 路徑上的邊就會被抵消掉;io

  因而有:

    $(u,v)$之間的距離 = (從 $LCA(u,v)$ 到 $u$ 的邊的權重和)+(從 $LCA(u,v)$ 到 $v$ 的邊的權重和)

  由於是單點更新,因此,咱們能夠考慮到用樹狀數組來維護 DFS序;

•Code

  POJ2736.cpp

相關文章
相關標籤/搜索