一只牛对应一个牛栏,求最大对应数量,就是二分图最大匹配;
我用的匈牙利算法(http://blog.csdn.net/lancelotcin/article/details/8796419);
一边过!
/*
ID : lancelot2
PROG : stall4
LANG : C++
*/
#include <fstream>
#include <cstring>
#define maxn 201
using namespace std;
int nx, ny;
bool edge[maxn][maxn];
int cx[maxn], cy[maxn];
int visited[maxn];
int path(int u)
{
int v;
for(v = 1; v <= ny; v++){
if(edge[u][v] && !visited[v]){
visited[v] = 1;
if(cy[v] == -1 || path(cy[v])){
cx[u] = v;
cy[v] = u;
return 1;
}
}
}
return 0;
}
int maxmatch()
{
int res = 0;
memset(cx, 0xff, sizeof(cx));
memset(cy, 0xff, sizeof(cy));
for(int i = 1; i <= nx; i++){
if(cx[i] == -1){
memset(visited, 0, sizeof(visited));
res += path(i);
}
}
return res;
}
int main()
{
ofstream fout("stall4.out");
ifstream fin("stall4.in");
fin >> nx >> ny;
int tempn, tempy;
for(int i = 1; i <= nx; i++){
fin >> tempn;
while(tempn--){
fin >> tempy;
edge[i][tempy] = 1;
}
}
int ans = maxmatch();
fout << ans << endl;
}