原题:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1531
题意:
给定一个n*m的矩阵;
矩阵里面有k个点,下面k行给出坐标;
有一把刷子,每次可以刷单位长度的一行或者一列;
问至少刷几次可以刷完所有的点;
思路:
将所有的点映射到格子的左下角,即只取坐标的整数部分;
再用最大匹配做;
#include<stdio.h>
#include<string.h>
const int maxn = 1e4+5;
int cas;
int n, m, k;
bool link[maxn][maxn], used[maxn];
int res[maxn];
bool find(int x)
{
for(int i = 0;i<m;i++)
{
if(link[x][i] == true && used[i] == false)
{
used[i] = true;
if(res[i] == -1 || find(res[i]))
{
res[i] = x;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d", &cas);
while(cas--)
{
int sum = 0;
memset(link, false, sizeof link);
memset(res, -1, sizeof res);
scanf("%d%d%d", &n, &m, &k);
while(k--)
{
double x, y;
scanf("%lf%lf", &x, &y);
link[(int)x][(int)y] = true;
}
for(int i = 0;i<n;i++)
{
memset(used, false, sizeof used);
if(find(i))
sum++;
}
printf("%d\n", sum);
}
return 0;
}