dfs函数是寻找该点能否找到另一个与之相连的点连接。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
#define N 505
int n,m;
vector<int>v[N]; //表示左边各点连接了的右边的点,其实存的是边的关系
bool flag[N]; //右边每个点的被标记的状态
int ans[N]; //右边每个点相连的起点
bool dfs(int x)
{
int len=v[x].size();
for(int i=0; i<len; i++)
{
//枚举每个右边的点
int ed=v[x][i];
//如果该点未被标记
if(flag[ed]==0)
{
//标记该点
flag[ed]=1;
//并检查该点是否有相连了的左边的点
//如果有相连,能否换一个点相连
if(ans[ed]==-1||dfs(ans[ed]))
{
//可以的话就把左边的点与右边的相连
ans[ed]=x;
//计数+1
return 1;
}
}
}
return 0;
}
int maxmatch()
{
int num=0;
memset(ans,-1,sizeof(ans));
//枚举左边的每个点
for(int i=1; i<=n; i++)
{
//此时所有点应该不被标记
memset(flag,0,sizeof(flag));
if(dfs(i))
num++;
}
return num;
}
int main()
{
int x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0; i<N; i++) v[i].clear();
while(m--)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
}
printf("%d\n",maxmatch());
}
return 0;
}