POJ 2763"Housewife Wind"(DFS序+树状数组+LCA)

 

传送门

 

•题意

  一对夫妇居住在 xx村庄,给村庄有 $n$ 个小屋;

  这 $n$ 个小屋之间有双向可达的道路,不会出现环,即所构成的图是个树;

  从 $a_i$ 小屋到 $b_i$ 小屋需要花费 $w_i$ 时间;

  初始,女主角在 $s$ 号小屋,有 q 次询问,每次询问为以下两种的一个:

    • 0 u : 她有个孩子在 $u$ 号屋,需要妈妈接她回家,输出从 $s$ 到 $u$ 的最短时间
    • 1 x val : 由于种种原因,第 $x$ 条道路的耗时由之前的 $w_x$ 变为了 $val$

•题解

  考虑如图所示的结构,在树上操作有些不便之处,所以,我们需要将其序列化;

  将上图所示的树,将其转化成 DFS序;

  $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$

  并令权重沿叶子方向为正,沿根方向为负;

  那么从 $u$ 第一次出现的位置到 $v$ 第一次出现的位置中,不属于 $u,v$ 路径上的边就会被抵消掉;

  于是有:

    $(u,v)$之间的距离 = (从 $LCA(u,v)$ 到 $u$ 的边的权重和)+(从 $LCA(u,v)$ 到 $v$ 的边的权重和)

  因为是单点更新,所以,我们可以考虑到用树状数组来维护 DFS序;

•Code

  POJ2736.cpp

 

posted @ 2019-11-02 15:46  HHHyacinth  阅读(52)  评论(0编辑  收藏