T2
题目:P2018 消息传递。
感觉比 T1 难,但是贪心策略没想到很不应该,基本策略想到了就能做了。
首先第一步是想到暴力的做法,我们不妨遍历每一个节点 \(u\),从 \(u\) 开始传递信息,如果从 \(u\) 传递完所有信息后时间最小,记录下来 \(u\) 即可。算法不难实现,跑两遍 \(DFS\) 可以实现。\(O(n^2 \log n)\) 的时间复杂度,应该能过,但不够优秀。

看这棵样例里给的树。
比如从 \(3\) 这个节点开始传递信息,第 \(1\) 秒时可以传递三个邻点 \(1,4,8\)。这里肯定选择先传给 \(4\),因为他的儿子最多。我们要求的是传递完的时间,故让原来最晚结束的最早开始是最好的。这个结论应该很显然,可我怎么想不到?
那么就很好写了,考虑自底向上 \(DFS\),父节点 \(u\) 的传递时间取决于他的儿子 \(v\) 最晚完成字树内最大传递时间加上 \(1\)。即 \(dp_u = max\{dp_v\}+1\)。
代码好写,贪心 + 树形 dp。

浙公网安备 33010602011771号