cf div3 1076 H(思维)
H. Remove the Grail Tree
一道超级不错的思维题,而且官方题解里还给出了两种不同的做法,\(dp\) 做法蒟蒻实在是看不懂,也不想补了,故这里只补容易想的写法。
权值只需要保留奇偶性这一信息,因此先将所有权值 \(\% 2\)。
注意到对于 \(a_{v}=0\) 的点 \(v\),其是否存在对其他点是没有影响的。因此,如果在初始时有 \(a_{v}=0\) 且 \(S_{v}\) 为奇数的点,可以直接删除。若 \(a_{v}=0\) 且 \(S_{v}\) 是偶数,则:
- 如果它的周围没有 \(a_{v}=1\) 的点,那么显然无解。
- 否则,如果在后面过程中可以删掉其周围的某个 \(a_{v}=1\),那么这个点就可以顺带着被删除。
于是,我们可以直接假设这样的 \(a_{v}=0\) 都已经被删了,只留下 \(a_{v}=1\) 的若干个连通块。因为 \(a_{v}=0\) 的点对于其他点是否可被删除是毫无影响的,这样更有助于我们后面过程的分析。我们只需要记录这些 \(a_{v}=0\) 的点周围有哪些 \(a_{v}=1\) 的点;只要删除了其中一个,接下来就立即删除它。
那么剩下的图就是 \(a_{v}=1\) 的若干棵树,显然对于每棵树可以单独考虑,只要某一个不能全删除则无解。
一个关键的结论:对于大小为偶数的树一定不能被删除;而大小为奇数的树一定可以全部删除。
前者的证明比较简单:点数为偶数的树,边数是奇数。而树内的所有点权值均为 \(1\)。因此,如果要对这棵树进行一次删除操作,每次删除的边数必然是偶数。因此,这棵树的边一定不能被全删光,进而整个图不能被删空。
后者的证明略困难一些:根据上面的证明,我们可以发现:在全 \(1\) 连通块中删除某个点后,新形成的所有子连通块大小也必须全是奇数。对每个点 \(v\) 记录一个值 \(f(v)\):将 \(v\) 删除后,形成新的偶数大小连通块的个数。显然我们每次只能删除 \(f(v)=0\) 的点。
注意到操作点所在连通块的大小是奇数,因此对于任意一条边,其连接的两个连通块大小的奇偶性一定是不同的。根据这一点,我们可以进一步得到删除 \(v\) 对于其他每个点 \(u\) 的 \(f(u)\) 值的影响:\(v\) 的所有邻居的 \(f(u)\) 值恰好减 \(1\),剩下其他点的 \(f(u)\) 值不变(可以自己手玩证明,这里不再赘述了)。
有没有发现这个过程很像拓扑排序?事实上的确是这样。我们可以先预处理出所有 \(f(v)=0\) 的点 \(v\),将其放入队列里并做拓扑排序就行了。
那又如何证明每个奇数大小连通块的所有点均能被删除?只需要证明整个拓扑排序的有向图无环即可。证明如下:
考虑树中的每条边,由上面的证明可知,其连接的两个连通块大小必然是一奇一偶。设连接的两个点是 \(u\) 和 \(v\),其中 \(u\) 所在连通块大小是奇数,\(v\) 是偶数,那么我们可以发现:只能先删 \(v\) 后删 \(u\)。而每条边都有这样的结论,因此我们可以将树中的每条边定向,形成的有向图就是整个拓扑排序的有向图。
由于 \(n\) 个点中的 \(n-1\) 条有向边是与原来的无向树一一对应的,在整个形态结构上仍然是一棵树,显然不存在环。并且由于所有点的入度总和是 \(n-1\),由鸽巢原理,必然存在入度为 \(0\) 的点。因此拓扑排序一定可以开始执行,并将图中的所有点依次删除。
注意在删除 \(a_{v}=1\) 时,若检查到其周围存在初始时未被删除的 \(a_{u}=0\),则在删 \(v\) 后,可以直接顺带着删除 \(u\)。
最后只需要检查所有点是否均被删除。具体实现见代码。

浙公网安备 33010602011771号