【题解】POJ3417 Network(倍增求LCA+DP+树上差分)

POJ3417:http://poj.org/problem?id=3417

思路

我们注意到由“主要边”构成一颗树 “附加边”则是非树边 把一条附加边(x,y)加入树中 会与树上x,y之间构成一个环

因此 我们称每条附加边(x,y)都把树上x,y之间的路径覆盖一次 我们只需要统计出每条“主要边”被覆盖几次

有以下几种情况

  • 第一步把覆盖0次的主要边切断 则第二步可以任意切一条附加边 ans+=m
  • 第一步把覆盖1次的主要边切断 则第二步只有一种选择切附加边 ans+=1
  • 第一步把覆盖2次或以上的主要边切断 则不可能击败Dark

这样我们就可以统计出ans

解决每条边的覆盖次数 需要用到树上差分算法 

我们给每个节点初值为0

对于每条附加边(x,y) 我们给x和y节点权值+1

对于x和y的lca节点权值-2(想想为什么)

设F(x)为以x为根的子树中各节点的权值和 则F(x)就是x与其父节点之间树边被覆盖的次数

最后统计ans即可

PS:这题需要把cin cout 改为scanf printf 不然会TLE 坑了我一晚上

猜你喜欢

转载自www.cnblogs.com/BrokenString/p/9769718.html