就是求覆盖所以1的最少的行加列的数量呢~!
二分法做。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define sf scanf
#define pf printf
#define INF 1<<29
#define clr(x) memset(x,0,sizeof(x))
#define Clr(x) memset(x,-1,sizeof(x));
#define N 500
int map[N][N];
int vis[N];
int link[N];
int n,m;
int find(int x){
for(int i=1;i<=m;i++){
if(map[x][i]&&!vis[i]){
vis[i]=1;
if(!link[i]||find(link[i])){
link[i]=x;
return true;
}
}
}
return false;
}
int main(){
int sum;
while(~sf("%d",&n)&&n){
sf("%d",&m);
clr(link);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sf("%d",&map[i][j]);
sum=0;
for(int i=1;i<=n;i++){
clr(vis);
sum+=find(i);
}
pf("%d\n",sum);
}
return 0;
}