La plupart se réfèrent à ce blog disposition https://blog.csdn.net/qq_37230495/article/details/88554607
Je suis juste moi - même pour ce code conformément à leurs propres idées pour expliquer, par référence.
#include<stdio.h>
#include<string.h>
#define MAX 100
int n,m;
bool line[MAX][MAX];//这个代表男生和女生的连线程度
bool used[MAX];//这个代表该女生是否被访问过
int girl[MAX];//这个代表该女生对应的男生是哪一个
bool find(int x)
{
for(int j=1;j<=m;j++)//扫描每一个妹子
if(line[x][j]==true&&used[j]==false)
//如果有暧昧关系,并且没有被标记过
{
used[j]=true;//以便于递归的时候,知道这个妹子被看中过。(懂了)
if(girl[j]==0||find(girl[j]))
//名花无主或者能挪出个位置来(也就是那个男生对应的女生有其他的),这里使用递归
{
girl[j]=x;
return true;
}
}
return false;
}
int main()
{
int cnt=0;
printf("请分别输入男生和女生的数量:");
scanf("%d %d",&n,&m);
int t;//有t对暧昧关系
printf("请输入有几对暧昧关系:");
scanf("%d",&t);
printf("请输入%d对暧昧关系:\n",t);
int x,y;
memset(line,false,sizeof(line));
memset(girl,0,sizeof(girl));//初始化girl没有和任何人配对
for(int i=0;i<t;i++)
{
scanf("%d %d",&x,&y);
line[x][y]=true;
}
for(int i=1;i<=n;i++)
{
memset(used,false,sizeof(used));
if(find(i))
cnt++;
}
printf("最大匹配数为:%d\n",cnt);
}