#include <stdio.h>
#include <cstring>
bool map[501][501];
bool vis[501];
int match[501];
int n,m;//注意,定义在主函数里的变量在main函数里面不能再定义。否则就失效,按0来计算!
bool find(int x)//寻找A可能匹配的点集合
{
for(int i=1; i<=m; i++)//m为待匹配集的个数
{
if(map[x][i]&&!vis[i])//如果AB边相连且B还没被匹配,那么将B标记为匹配
{
vis[i]=true;
if(match[i]==-1||find(match[i]))//如果B在原匹配的点集match中没有与任何点匹配
//或者B和C匹配,且C存在增广路,那么AB必定也存在增广路
{
match[i]=x;//路径取反
return true;
}
}
}
return false;
}
int main()
{
int k,a,b;
while(scanf("%d",&k)==1)
{
if(k==0) break;
scanf("%d%d",&n,&m);
memset(map,false,sizeof(map));
memset(match,-1,sizeof(match));
while(k--)
{
scanf("%d%d",&a,&b);
map[a][b]=true;//用a来匹配b
}
int count=0;
for(int i=1; i<=n; i++)//n为匹配集的个数
{
memset(vis,false,sizeof(vis));
if(find(i)) count++;
}
printf("%d\n",count);
}
return 0;
}
hdu 过山车 二分匹配模板
最新推荐文章于 2021-09-12 13:29:31 发布