#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 过山车 二分匹配模板
最新推荐文章于 2025-06-20 14:33:40 发布
本文介绍了一种用于解决最大匹配问题的算法,通过在给定的匹配集中找到尽可能多的配对,该算法利用深度优先搜索和回溯技术在有限时间内高效地解决了这一经典计算机科学问题。


1937

被折叠的 条评论
为什么被折叠?



