NTR渣男版注释,y总太有才啦hhh
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 510, M = 100010; // 单向就行,M不用乘以2
int n1, n2, m;
int h[N], e[M], ne[M], idx;
int match[N]; // match是妹子目前在和哪个男生处对应的男生编号
bool st[N]; // 判重,每次不要重复搜一个点
void add(int x, int j) // x渣男和他的备胎j妹们
{
e[idx] = j, ne[idx] = h[x], h[x] = idx ++ ;
}
bool find(int x)
{
for (int i = h[x]; i != -1; i = ne[i]) // 有时会错写成i = -1
{
// 遍历x男的临边,因此所有的j都是x男的备胎,
// 取出j妹
int j = e[i];
// 这个妹子之前必须没有被x男考虑过,因此st[j]要为0
// st[j]==0也是为什么main函数中每次要清空st的原因,因为每次只判断j妹子是不是x男的菜
if (!st[j])
{
st[j] = true;
// 如果这个妹子还没有匹配任何男生(match[j] == 0)
//或者她匹配了一个有备胎的男生(find(match[j]))的话
if (match[j] == 0 || find(match[j]))
{
// 这个x男就可以NTR这个妹子j
match[j] = x;
return true;
}
}
}
// 实在不行的话,这个男生就会一直单身,返回false
return false;
}
int main()
{
// n1男生数量,n2妹子数量,m边的数量
cin >> n1 >> n2 >> m;
memset(h, -1, sizeof h);
while (m -- )
{
// x男和备胎j妹
int x, j;
scanf("%d%d", &x, &j);
add(x, j);
}
int res = 0; // res存匹配的数量
// for循环依次分析一下每个男生该找哪个妹子
for (int i = 1; i <= n1; i ++ )
{
// 每次分析之前先把所有的妹子清空
memset(st, false, sizeof st); // 差点忘了写这句
// 如果这个妹子成功找到男朋友的话,就让答案++
if (find(i)) res ++ ;
}
cout << res << endl;
return 0;
}