ABC351D
[ABC351D] Grid and Magnet
题意简述
给定一个 \(h\times w\) 的网格,有些网格中有磁铁。你可以向上下左右移动 \(1\) 格。
当这个格子上下左右有磁铁时你不能移动。
对于每个没有磁铁的单元格,将其自由度定义为从该单元格重复移动所能到达的单元格数。求网格中所有没有磁铁的单元格的最大自由度。(不一定一次性,只要有一种方案可达)。
称受磁铁影响的格子为禁地。(有去无回)
法1
分析
根据定义,能到达的单元格分为两类:
- 禁地。
- 非禁地。
平时做到的题目好像没有有去无回的,都是①双向连通,并查集就可以求最大连通块。
于是考虑先剔除禁地和磁铁格,可以将图分成好多个连通块,②连通块内的点彼此可达。
再来考虑禁地:对于每个连通块,四周禁地也是可达的(因为去到就行,不用回来),计入答案。
做法
先用并查集,然后枚举每个连通块内的所有点的周边禁地总数(去重)。
更好的做法是枚举禁地,向四周连通块贡献 \(1\)。(去重)
可以考虑直接在维护并查集时维护 size
(存在差异,我们需要特判在同一个集合,否则会导致 size
计算出错,调了 1h 多)。
https://atcoder.jp/contests/abc351/submissions/52948232
法2
分析
答案至少是 \(1\)。
朴素做法:从每个点出发搜索。
因此可以从非禁地(禁地反正是 \(1\),搜一下也行)出发,搜索可达的点,计算答案(遇到禁地就不扩展,也要计入答案)。
性质:出发点必须是没有被遍历到过的点。(非禁地:①②,方案一样;禁地:动不了,反正 \(\text{ans}=1\))
由于连通块四周禁地的存在,搜索时可能搜索到之前访问过的点,但是这些点必定是禁地,不影响复杂度。
较法1实现更简单,但是考虑的细节更多。(其实差不多)