题目链接 https://www.jisuanke.com/course/709/36569
题解:刚看到这道题的时候,感觉是二分图匹配。然而只是知道二分匹配,没有具体学过,就趁着这题大致学了下匈牙利算法。
这题没什么好说的,就是一个标准的匈牙利模板,去网上搜匈牙利算法,就是以此题为原型讲的。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MAXN 10010
using namespace std;
vector<int> vec[MAXN];// 每个女生接受的男生
int boy[MAXN];// 男生的女朋友编号
bool used[MAXN];
int n;
// 匈牙利算法核心代码
// 判断x号女生是否能匹配到男生
bool Find(int x) {
// 遍历x女生喜欢的男生
int len = vec[x].size();
for(int i = 0;i < len;i++) {
if(used[vec[x][i]]) continue;
used[vec[x][i]] = true;
if(!boy[vec[x][i]] || Find(boy[vec[x][i]])) {
boy[vec[x][i]] = x;
return true;
}
}
return false;
}
int main() {
scanf("%d",&n);
for(int i = 1;i <= n;i++) {
int num = 0;
scanf("%d",&num);
int t = 0;// 临时变量
for(int j = 0;j < num;j++) {
scanf("%d",&t);
vec[i].push_back(t);
}
}
int res = 0;
// 遍历女生
for(int i = 1;i <= n;i++) {
memset(used,0,sizeof(used));
if(Find(i)) res++;
}
printf("%d\n",res);
return 0;
}