一、题目
题目描述
\(zxy\) 要刷题,现在有一片 \(n\times m\) 的矩阵题库,每个格子对应一道题,他想把一些题刷 \(\tt Wa\),另一些题刷 \(\tt Tle\),每次可以选一整行或者一整列刷题。初始时每道题都没有提交,提交记录会覆盖,问达到目标刷题状态的最小步数,无解输出 \(-1\)
\(n,m\leq3000\)
解法1
考虑图论,每行每列的点拆成刷红或者刷蓝,代表选取的不同方案,我们把决策建在了点上,考虑把限制建在边上。也就是如果 \((i,j)\) 是蓝色,那么点 \(row(i,R)\) 连向 \(col(j,B)\),点 \(col(j,R)\) 连向 \(row(i,B)\),这里的边代表刷了起点就必须刷终点,\((i,j)\) 为红色的情况同理。
无解的情况是出现环,如果没有无解,考虑如果刷一个点那么管辖范围内的点都要刷,可以按照拓扑序来刷,那么每个点最多刷一次就足以解决限制。这说明了答案的上界是 \(n+m\)(如果是某个点的刷红连向了刷蓝,那么一定选刷蓝,因为刷红是完全无效的!),现在要刷满行或者刷满列才行,考试时我在图上决策,发现根本做不动!
这时候要回到原图了!考虑刷满行的情况,每行都要刷红或者刷蓝,如果某个列和行决策颜色对应相同,那么就不需要染色了,否则一定需要染色。那么我们把每个列 \(\tt hash\) 一下,找到数量最大的列的种类,设数量是 \(x\),可以通过设置行的决策来让这些列都不选,那么答案就是 \(n+m-x\),并且根据图论我们知道这样做合法且最优。对于刷满列的情况同理,把行 \(\tt hash\) 一下即可,时间复杂度 \(O(nm)\)
解法2
最后一步刷的一定是整行整列颜色相同的,可以根据这个性质去倒推,留给读者思考吧
总结
复杂的问题可以考虑图论,但是不要被图所困住了,原问题对于图论是及其重要的。