C++ 代码
// #include<cstring>
// #include<iostream>
// #include<algorithm>
// using namespace std;
// const int N=510,M=100010;
// int n1,n2,m;
// int h[N],e[M],ne[M],idx;
// int match[N];//表示i号女生和哪个男生匹配
// bool st[N];//这个st数组是针对每个男生来说的,判断某个女生是否被考虑过
// void add(int a,int b)
// {
// e[idx]=b,ne[idx]=h[a],h[a]=idx++;
// }
// //判断x号男生能不能找到妹子
// bool find(int x)
// {
// //遍历所有和他有关系的妹子
// for(int i=h[x];i!=-1;i=ne[i])
// {
// int j=e[i];
// //如果这个妹子没有被i考虑过
// if(!st[j])
// {
// st[j]=true;
// //如果j妹子没有匹配过或者她的男友还可以找到别人
// //那么i和j匹配
// if(match[j]==0||find(match[j]))
// {
// match[j]=x;
// return true;
// }
// }
// }
// //实在不行的话,只能返回false
// return false;
// }
// int main()
// {
// scanf("%d%d%d",&n1,&n2,&m);
// memset(h,-1,sizeof h);
// while(m--)
// {
// int a,b;
// scanf("%d%d",&a,&b);
// add(a,b);
// }
// //先到先得,能让则让
// //一个妹子对两个男生有好感,排在前边的男生一定有妹子选
// int res=0;//表示当前的最大 匹配的数量
// for(int i=1;i<=n1;i++)
// {
// //对于每个男生,每次选之前,先把所有
// //妹子都清空,表示都还没有考虑过.
// memset(st,false,sizeof st);
// //如果i号男生成功找到了一个妹子
// if(find(i)) res++;
// }
// printf("%d\n",res);
// return 0;
// }
// #include<iostream>
// #include<cstring>
// #include<algorithm>
// using namespace std;
// const int N=510, M=100010;
// int n1, n2, m;//定点数和边数
// int h[N], e[M], ne[M], idx;
// int match[N];//表示i号女生和哪个那声匹配
// bool st[N];//表示i好女生是否被某个男生考虑过
// void add(int a, int b)
// {
// e[idx]=b, ne[idx]=h[a], h[a]=idx++;
// }
// bool find(int x)//判断x号男生能否找到妹子
// {
// //遍历和这个男生有关系的所有妹子
// for(int i=h[x]; i!=-1; i=ne[i])
// {
// int j=e[i];
// if(!st[j])
// {
// st[j]=true;
// if(match[j]==0 || find(match[j]))
// {
// match[j]=x;
// return true;
// }
// }
// }
// return false;
// }
// int main()
// {
// cin>>n1>>n2>>m;
// memset(h, -1, sizeof h);
// while(m--)
// {
// int a, b;
// scanf("%d%d", &a, &b);
// add(a, b);
// }
// int res=0;
// //先到先得, 能让 则让
// //一个妹子对两个男生又好感,排在前边的男生一定可以选上
// for(int i=1; i<=n1; i++)
// {
// //对于每个男生来说,每次选之前,每个妹子都是没有考虑过的
// memset(st, false, sizeof st);
// if(find(i)) res++;
// }
// printf("%d\n", res);
// return 0;
// }
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510, M=100010;
int n1, n2, m;
int h[N], e[M], ne[M], idx;
int match[N];
bool st[N];
void add(int a, int b)
{
e[idx]=b, ne[idx]=h[a], h[a]=idx++;
}
bool find(int x)//递归判断x号男生能否找到女生
{
for(int i=h[x]; i!=-1; i=ne[i])
{
int j=e[i];
if(!st[j])
{
st[j]=true;
if(match[j]==0 || find(match[j]))
{
match[j]=x;
return true;
}
}
}
return false;
}
int main()
{
cin>>n1 >> n2 >> m;
memset(h, -1, sizeof h);
while(m--)
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b);//建一个男生指向女生的单向边就行了,因为男生要对所有与他有关系的女生进行遍历
}
int res=0;
for(int i=1; i<=n1; i++)
{
memset(st, false, sizeof st);
if(find(i)) res++;
}
printf("%d\n", res);
return 0;
}