poj3585 Accumulation Degree 题解报告

题目传送门

【题目大意】

一个树形水系,有$n$个结点,根结点称为源点,叶子结点称为汇点,每条边都有水量限制$C_{x,y}$($x,y$为这条边的两个端点),源点单位时间流出的水量称为整个水系的流量,求以哪一个结点作为源点整个水系的流量最大。

【思路分析】

这是一道“不定根”的树形DP问题,这类题目的特点是,给定一个树形结构,需要以每个结点为根进行一系列统计。我们一般通过两次扫描来求解此类问题:

1.第一次扫描,任选一个点为根,在“有根树”上执行一次树形DP。

2.第二次扫描,从刚才选出的根出发,对整棵树执行一次DFS,在每次递归前进行自上而下的推导,计算出“换根”之后的解。

首先,我们任选一个结点$root$,然后树形DP一下,求出$D_{root}$数组($D[i]$表示在以$i$为根的子树中流量的最大值)。然后设$f[x]$表示以x为源点,流向整个水系的最大流量,则显然$D[root]=f[root]$。假设$f[x]$已经求出,考虑其子结点$y$,则$f[y]$包含两部分:

1.从$y$流向以$y$为根的子树的流量,已经计算出来。

2.从$y$沿着到父节点$x$的河道,进而流向水系中其他部分的流量。

由题意可得,从$x$流向$y$的流量为$min(D[y],c[x][y])$,所以从$x$流向除$y$以外其他部分的流量就是二者之差$f[x]-min(D[y],c[x][y])$。于是,把$y$作为源点,先流到$x$,再流向其他部分的流量就是把这个“差”再与$c[x][y]$取较小值后的结果。

$$if(du[x]>1)\to f[y]=D[y]+min(f[x]-min(D[y],c[x][y])-c[x][y])$$

$$if(du[x]==1)\to f[y]=D[y]+c[x][y]$$

这是一个由上而下的递推方程,我们通过一次DFS即可实现。

【代码实现】

猜你喜欢

转载自www.cnblogs.com/THWZF/p/11010281.html