题目
链接
题意简述
给出一棵节点数为 $n \ (n <= 1000)$ 的树,每条边长度为 $1$ 。
一次操作作用于一个节点,并将距此节点 $dist <= 2$ 的节点染色,求将整棵树染上颜色的最小次数。
思路
暴力
首先考虑暴力,也就是暴力枚举。
时间复杂度: $O(n^{2})$ 。
由于数据太水,暴力随便打吧。
贪心
一开始我是想到节点要尽可能向中间靠拢,染色少浪费,可是并不容易做到。
从上向下?没思路。(一开始没想到)
但从下向上就好想多了。
记录 $BFS$ 序,也就是深度。
从最底层找起,当它没被染色时,给它的爷爷(雾)染色 $(depth <= 2)$ ,这样能保证高效利用。
为什么不用 $DFS$ 记录呢?
- 效率不及 $BFS$ 。
- 记录深度还要排序,而 $BFS$ 记录只需要一个栈。
时间复杂度: $O(n)$ (大概吧)。
树形DP
我太蒻了,并不会。。。。。
代码
1 |
|
杂项
- 这里用了 $std::pair$ 实现,$std::pair$ 大法好!