匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。它是一种用增广路径求二分图最大匹配的算法。
贴网站
http://blog.csdn.net/dark_scope/article/details/8880547
加一些自己的理解
对于这个dfs,比较难理解的是used
int dfs(int u)
{
for(int v=1;v<=m;v++)
{
if(ch[u][v]==1&&!used[v])
{
used[v]=1;
if(link[v]==0||dfs(link[v]))
{
link[v]=u;
return 1;
}
}
}
return 0;
}
used的作用是用来记录虚线,就是图中的黄线
这表示在递归的过程中这个男生不能配对因为他正在配对待机中,(题目和图片的男生女生是反着的)
同时used!=0也代表了在这次查询中这个男生已经没希望了
下次配对used清零
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int n,m,ch[1005][1005],used[1005],link[1005];
int dfs(int u)
{
for(int v=1;v<=m;v++)
{
if(ch[u][v]==1&&!used[v])
{
used[v]=1;
if(link[v]==0||dfs(link[v]))
{
link[v]=u;
return 1;
}
}
}
return 0;
}
int main()
{
int k,x,y,ans;
while(~scanf("%d",&k)&&k!=0)
{
ans=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ch[i][j]=0;
while(k--)
{
scanf("%d %d",&x,&y);
ch[x][y]=1;
}
memset(link,0,sizeof(link));
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i)==1)
ans++;
}
printf("%d\n",ans);
}
return 0;
}