代码实现是通过(连锁反应)实现的,也叫增广路,每次发现一次增广路配对数就加1.
增广路本质就是一条路径的起点和终点都是未被配对的点。
如果)前匹配方案下再也找不到增广路,(继续对剩下没有被匹配的点一一进行配对,直到所有的点都尝试完毕,找不到新的增广路为止
/*
input:
6 5
1 4
1 5
2 5
2 6
3 4
output:
3
*/
#include<stdio.h>
int e[101][101];
int match[101];
int book[101];
int n,m;
int dfs(int u)
{
int i;
for(i=1;i<=n;i++)
{
if(book[i]==0&&e[u][i]==1)
{
book[i]=1;
//如果点i未被配对或者找到了新的配对
if(match[i]==0||dfs(match[i]))
{
//更新配对关系
match[i]=u;
match[u]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,t1,t2,sum=0;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&t1,&t2);
e[t1][t2]=1;
e[t2][t1]=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
book[j]=0;//清空上一次搜索时的标记
if(dfs(i))
sum++;
}
printf("%d\n",sum);
return 0;
}
)那么当前匹配就是最大匹配了。