POI2014 洛谷P3574 FarmCraft 题解

题目链接

https://www.luogu.com.cn/problem/P3574

题目大意

给定一棵树,每个结点有一个村庄,小明从 \(1\) 号结点出发,每条边仅往返各一次,他每次到达一个村庄,就放下一台电脑,并立即向其他村庄行进。小明走每条边需要花费一个单位时间。每个村庄收到电脑后,会立即安装一款软件,第 \(i\) 个村庄安装软件需要花费 \(c[i]\) 的时间。小明最终返回 \(1\) 号结点后,才会给自己安装软件。问所有村庄都安装完软件最少需要多长时间。

输入格式

一个 \(n\),表示结点个数;
\(n\) 个数,表示每个结点安装软件需要花费的时间
\(n-1\) 行,每行两个数,表示每条边

输出格式

就是最少时间

输入样例

6
1 8 9 6 3 2
1 3
2 3
3 4
4 5
4 6

输出样例

11

分析

我们考虑这个题目的答案的构成。需要最少的时间,一部分是他走完所有村庄的时间的开销 \(+\) 他自己安装软件;
另一部分是返回到 \(1\) 号结点后等待其他村庄安装完成的时间,两者取最大值即可。
对于后者来说,我们必须先求出返回每棵子树的根结点后,还需要等待的时间,才能退出最终结果。
因此,我们尅定义 \(f[i]\) 表示返回以 \(i\) 为根的子树的根结点 \(i\),要完成安装,还需要等待的时间。

  • 对于以 \(i(i>1)\) 号结点为根的子树,从 \(i\) 出发走完并返回 \(i\) 所需要的时间为 \(2\times (size[i]-1)\),其中\(size[i]\) 表示子树 \(i\) 总共的结点个数。
  • 那么只考虑自己安装软件的情况下,需要等待的时间为 \(a[i]-2\times(size[i]-1)\),如果小于 \(0\),说明返回后软件已经安装完成,所以对结果的真正的贡献为 \(\max(0, a[i]-2\times(size[i]-1))\)
  • 当然可能他的子孙结点的安装软件速度很慢,有可能大于上述的贡献值,因此我们还要考虑子孙的贡献。

未完待续……

猜你喜欢

转载自www.cnblogs.com/kuangbiaopilihu/p/13183603.html