//行列匹配就okay了
#include <cstdio>
#include <iostream>
#include <vector>
#include <memory.h>
using namespace std;
const int N=110;
int match[N],vis[N],map[N][N];
vector<int> v[N];
int n,m,ans;
int find(int x)
{
int i,tmp,y=v[x].size();
for(i=0;i<y;i++)
{
tmp=v[x][i];
if( vis[tmp]==0 )
{
vis[tmp]=1;
if( match[tmp]==0 || find(match[tmp]) )
{
match[tmp]=x;
return 1;
}
}
}
return 0;
}
void solve()
{
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
ans+=find(i);
}
}
int main()
{
// freopen("in","r",stdin);
// freopen("out","w",stdout);
int i,r;
while( scanf("%d",&n) && n )
{
scanf("%d",&m);
memset(map,0,sizeof(map));
memset(match,0,sizeof(match));
ans=0;
for(i=1;i<=n;i++)
{
v[i].clear();
for(r=1;r<=m;r++) scanf("%d",&map[i][r]);
}
for(i=1;i<=n;i++)
for(r=1;r<=m;r++)
if( map[i][r] ) v[i].push_back(r);
solve();
printf("%d\n",ans);
}
return 0;
}
hdu 2119 二分图匹配之最小点集覆盖
最新推荐文章于 2019-10-10 22:16:52 发布