$\Large\mathcal{Description}$
有 $n$ 个球和 $m$ 个筐子。
每个筐里最多能装三个。如果一个筐子内有不超过 $1$ 个球,那么我们称这样的筐子为半空的。
每个球都必须放进一个筐子中。且对于每个球有一些限制,即能放进哪个筐里。
现要求半空的筐最多有几个,并输出方案。
小 I 浅笑:“所以,等我领图灵奖吧!”
$\Large\mathcal{Solution}$
机房大佬介绍的一道题 刚学的带花树,但发现基本找不到题
首先,每个筐里最多放三个球。我们可以把每个筐拆成三个点,再把每个球作为一个点。这样,用我们最终得出的方案构成的图中,每个点的度数一定都不会超过1
这就与一般图的最大匹配相似,但我们显然不能直接跑一遍带花树。因为装有一个球以上的筐会对答案造成影响。所以我们必须操作一下
有一种很妙的想法就是, 在每个筐拆出的三个点之间互相连边。$\mathcal{Why?}$
我们依次进行考虑
- 非半空的筐子(即装有 $2$ 或 $3$ 个球)。他们对答案作出的贡献是无意义的,所以要减去。而他们对答案的影响就是装有的球数。
- 装有 $1$ 个球的筐子。他们对答案应作出 $1$ 的贡献。但由于筐的三个点之间有连边,所以他们对当前答案(即带花树跑出来的结果)贡献是 $2$。所以减 $1$。
- 空的筐。他们对答案应作出 $1$ 的贡献。但由于筐的三个点之间有连边,所以他们对当前答案的贡献是 $1$。所以不变。
归纳一下就可以得到,一个筐内装有多少球,他就对最终答案造成了多少影响。
由于每个球都必须放入一个筐子, 所以,最终答案就等于带花树跑出来的答案减去 $n$。
$\Large\mathcal{Code}$
1 | //冗长的代码 |
$\huge\mathcal{CSP 2019}$ $\huge\color{red}{\mathcal{R}}\color{yellow}{\mathcal{P}}\color{orange}{++}$