http://blog.csdn.net/ivy_uu/article/details/52091873
https://www.cnblogs.com/shenben/p/5573788.html
//
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,x,y,cnt,M;
int line[15][15],girl[25],used[25];
bool find(int x){
int i,j;
for (j=1;j<=(n+m);j++){ //扫描每个妹子
if (line[x][j]==true && !used[j])
//如果有暧昧并且还没有标记过(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了)
{
used[j]=1;
if (girl[j]==0 || find(girl[j])) {
//名花无主或者能腾出个位置来,这里使用递归
girl[j]=x;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d%d",&n,&m,&M);
for(int i=1;i<=M;i++)//枚举暧昧关系
{
scanf("%d%d",&x,&y);
line[x][y]=1,line[y][x]=1;
}
for(int i=1;i<=n;i++)//枚举n个男人
{
memset(used,0,sizeof used);
if(find(i)) cnt++;
}
cout<<cnt<<endl;
}
2 2 3
1 3
1 4
2 3
out:2
3 3 4
1 4
1 5
2 4
3 5
out:2
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
int n,m,line[205][205],vis[205],girl[205],t,cnt;
int find(int x)
{
for(int y=1;y<=m;y++)
{
if(line[x][y]==1 && !vis[y])
{
vis[y]=1;
if(girl[y]==0 || find(girl[y]))//这个不要忘
{
girl[y]=x;
return 1;
}
}
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
int j;
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
scanf("%d",&j);
line[i][j]=1;//不要写line[j][i]=1
}
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof vis);
if(find(i)) cnt++;
}
cout<<cnt<<endl;
}