(一道基础的二分图匹配)
题目意思大概为N个牛和M个栅栏,一个牛和一个栅栏只能匹配一次,求最大匹配
直接套用二分图最大匹配模板即可
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
vector<int> data[505];
int match[505];
bool used[505];
void add_edge(int from, int to)
{
data[from].push_back(to);
}
bool max_pipei(int f)
{
used[f] = true;
for(int i = 0; i < data[f].size(); i++)
{
int u = data[f][i];
if(match[u] == -1 || !used[match[u]] && max_pipei(match[u]))
{
match[f] = data[f][i];
match[data[f][i]] = f;
return true;
}
}
return false;
}
int main()
{
int N, M;
while(~scanf("%d %d", &N, &M))
{
for(int i = 0; i < N; i++)
{
data[i].clear();
}
for(int i = 0; i < N; i++)
{
int n;
scanf("%d", &n);
for(int j = 0; j < n; j++)
{
int m;
scanf("%d", &m);
add_edge(i, N + m - 1);
}
}
int num = 0;
fill(match, match + N + M, -1);
for(int i = 0; i < N; i++)
{
fill(used, used + N + M, false);
if(max_pipei(i))
{
num++;
}
}
printf("%d\n", num);
}
}