对于30%的数据
nnn 很小,直接暴力搜索边是否选择。

对于50%的数据
给 O(n2)O(n^2)O(n2) 的做法通过,自由发挥。

对于100%的数据
我们可以贪心的思考,每一个城市都往最近的一个大商场前进。
那么就将所有有大商场的城市都加入队列,并向外一层层拓展,如果拓展到的点是遍历过的则不加入队列并删除拓展所走的边,否则加入队列。
我们来证明这样的贪心是正确的。
由于题目中说“原来的兔子王国已经满足了兔子们的要求”,那么可以保证每一个点都是可以往最近的大商场走的,不会不满足最多走 ddd 条路的限制。
设 kkk 为有(一个或多个)大商场的城市数。
想象一下,将有大商场的城市与离他最近的其他城市看成一个点,那么缩点完后有 kkk 个点。因为原先是树,缩点后也依旧会是树。
那么多余的边数就是 k−1k-1k−1,用来连接这 kkk 个点的边。
以上证明了答案的可行性,接下来我们证明 k−1k-1k−1 是最大能删的边数。
我们假设能删除 k+t(t>=0)k+t(t>=0)k+t(t>=0) 条边,那么就说明缩点后的树有 k+1+tk+1+tk+1+t 个点(缩点意义上),而我们只有 kkk 个城市有大商场,那么至少有一个点是没有大商场的,因此不可能删除这么多边。
至此,我们证明了 k−1k-1k−1 是最大的答案。
那么就不需要实现bfs了,直接去重得到 kkk 就好了。
std:
https://paste.ubuntu.com/p/BpRjWBxcFd/

总题解参见:https://ac.nowcoder.com/discuss/233498?type=101&order=3&pos=6&page=0