由题意可知,这其实就是让求最小覆盖点;
在二分图中,选取最少的点数,使这些点和所有的边都有关联(把所有的边的覆盖),叫做最小点覆盖。
可知 、最小点覆盖数 = 最大匹配数(证明略,自行百度);则按照求最大匹配数的模板来就可以了;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n,m;
int used[110],link[110],mat[110][110];
int dfs(int t)
{
int i;
for(i=1;i<=m;i++)
{
if(used[i]==0&&mat[t][i])
{
used[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=t;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j;
while(scanf("%d",&n),n!=0)
{
scanf("%d",&m);
memset(link,-1,sizeof(link));
memset(mat,0,sizeof(mat));
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d",&mat[i][j]);
int num=0;
for(i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i))
num++;
}
printf("%d\n",num);
}
return 0;
}