给出一个map,再给出几个星星的坐标,问用枪可以一次打一行或者一列的星星,问至少打几次可以把所有星星打完....
建图,最大匹配问题,左边是x横坐标的点,右边是y纵坐标,然后当某个星星在x,y 点上时候说明可以在x行或者y列打枪
因此把x-y连一条边,最终就是求最小的点覆盖所有的边(即和所有的边有关联)=最大匹配,直接匈牙利模版水过
#include <stdio.h>
#include <string.h>
#define N 505
int match[N],map[N][N];
int cn,mn;
bool used[N];
int find(int x)
{
for(int i=1;i<=cn;i++)
if(!used[i]&&map[x][i])
{
used[i]=true;
if(match[i]==-1||find(match[i]))
{
match[i]=x;
return true;
}
}
return false;
}
int Hungry()
{
int sum=0;
for(int i=1;i<=cn;i++)
{
memset(used,false,sizeof(used));
if(find(i))sum++;
}
return sum;
}
int main()
{
int num,st,x,y;
while(~scanf("%d%d",&cn,&mn))
{
memset(map,0,sizeof(map));
memset(match,-1,sizeof(match));
for(int i=1;i<=mn;i++)
{
scanf("%d%d",&x,&y);
map[x][y]=1;
}
printf("%d\n",Hungry());
}
}

浙公网安备 33010602011771号