POJ 3041 (问题1) 给出一个N*N的矩阵,有些格子上有障碍,要求每次消除一行或者一列的障碍,最少消除多少次可以全部清除障碍。
POJ 2226 (问题2) 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中相邻的格子,最少消除多少次可以全部清除。
对于问题1,可以考虑把每行x或者每列y看成一个点,而障碍物(x,y)可以看做连接x和y的边。按照这种思路构图后。问题就转化成为选择最少的一些点(x或y),使得从这些点与所有的边相邻,其实这就是最小点覆盖问题。在二分图中,最小点覆盖数=最大匹配数。所以可以用匈牙利算法解决。
对于问题2,不能一次消除一行或一列,只能一次消除相邻的,怎么办?
实质上问题2和问题1是相同的,只是需要一步预处理。扫描一遍输入的矩阵,把每行和每列中相邻的障碍物看成一个点,记录一下,然后加边。这样就转化成了问题1。
POJ 3041
POJ 2226