换根dp小结

前言

这个东西据说(听师兄说)是这次 C S P S CSP-S 最后一题的题解做法,虽然还没去钻研那题,但是姑且算是把这个东西学会了。

思路

首先这是个在树上用的东西,一般就是不告诉你哪个点作为根,而你就需要求出所有点作为根时的答案,然后才能得到最终的答案。

思路也不是什么很神奇的东西:就是一开始先固定一个点作为根,然后 d p dp 一次求出解,然后利用这个解再做一次 d p dp ——这次 d p dp 我们称为换根,这次 d p dp 求出其他点作为根时的解。

例题

例1

给出一棵有 n n 个点的树,设 s u m [ x ] sum[x] 表示 x x 到其他点的距离之和,要求出 i = 1 n s u m [ i ] \sum_{i=1}^n sum[i]

这个就是一个换根 d p dp 的入门题了,我们先随便固定一个点作为根,设这个点为 x x ,然后 O ( n ) O(n) 求出 s u m [ x ] sum[x] ,然后开始换根,考虑对于 x x 而言,如何求出他的一个儿子 y y s u m sum

我们发现,树中点此时一共有两类:1、 y y 的子树内的点;2、 不在y的子树内的点。

对于第一类点,他们到 y y 的距离之和就是 s u m [ y ] sum[y]

对于第二类点,他们到 y y 的距离其实就是到 x x 的距离再加上 l e n ( x , y ) len(x,y) 。( l e n ( x , y ) len(x,y) 表示 x x y y 的那条边的长度。)

s i z e [ x ] size[x] 表示以 x x 为根的子树大小,那么很容易可以知道,第二类点一共有 s i z e [ x ] s i z e [ y ] size[x]-size[y] 个。所以第二类点到 y y 的距离之和就是 s u m [ x ] s u m [ y ] + ( n s i z e [ y ] ) × l e n ( x , y ) s i z e [ y ] × l e n ( x , y ) sum[x]-sum[y]+(n-size[y])\times len(x,y)-size[y]\times len(x,y)

加起来就是 s u m [ y ] = s u m [ x ] + ( n 2 × s i z e [ y ] ) × l e n ( x , y ) sum[y]=sum[x]+(n-2\times size[y])\times len(x,y)

例2 & 例3

(难度应该是递增的)
TJOI 2017 城市         题解
APIO 2014 连珠线     题解

发布了234 篇原创文章 · 获赞 100 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/a_forever_dream/article/details/104020993
今日推荐