思路:求最小点覆盖
#include<string.h>
#include<iostream>
#include<vector>
using namespace std;
vector<int> edge[110];
bool used[110];
int con[110];
bool find(int x)
{
for (int i = 0; i < edge[x].size(); i++)
{
if (!used[edge[x][i]])
{
used[edge[x][i]] = true;
if (con[edge[x][i]] == -1 || find(con[edge[x][i]]))
{
con[edge[x][i]] = x;
return true;
}
}
}
return false;
}
int match(int n)
{
int res = 0;
memset(con, -1, sizeof(con));
for (int i = 0; i < n; i++)
{
memset(used, false, sizeof(used));
if (find(i))
res++;
}
return res;
}
int main()
{
int n, m;
while (cin >> n&&n)
{
cin >> m;
for (int i = 0; i < n; i++)
edge[i].clear();
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
int x;
cin >> x;
if (x == 1)
edge[i].push_back(j);
}
cout << match(n) << endl;
}
return 0;
}