#include<stdio.h>
#include<string.h>
const int N=500,M=500,INF=0x3f3f3f3f;
int dx[N],dy[M],sx[N],sy[M],p[N],q[N],a[N][M],l,r,n,m,d;
//dxΪ×ó±ßµãÔÚÔö¹ã·¾¶ÖеľàÀ룬dyͬÀí£»sxΪ×ó±ßµãµÄÆ¥Åäµã£¬syͬÀí£»
//nΪ×ó±ßµãÊý£¬mΪÓұߵãÊý£¬dΪÿ´ÎbfsÖÐ×î´óÔö¹â·¼¯ÖеÄ×·¾¶³¤¶È
int bfs()
{
l=r=0;
memset(dx,-1,sizeof(dx));
memset(dy,-1,sizeof(dy));
int i,u;d=INF;
for(i=1;i<=n;i++)
{
if(sx[i]==-1)
{
q[++r]=i;
dx[i]=0;
}
}
while(l<r)
{
u=q[++l];
if(dx[u]>d) break;
for(i=1;i<=m;i++)
{
if(a[u][i]&&dy[i]==-1)
{
dy[i]=dx[u]+1;
if(sy[i]==-1) d=dy[i];
else
{
dx[sy[i]]=dy[i]+1;
q[++r]=sy[i];
}
}
}
}
return d!=INF;
}
int dfs(int u)
{
for(int i=1;i<=m;i++)
{
if(a[u][i]&&!p[i]&&dy[i]==dx[u]+1)
{
p[i]=1;
if(sy[i]!=-1&&dy[i]==d) continue;
if(sy[i]==-1||dfs(sy[i]))
{
sy[i]=u,sx[u]=i;
return 1;
}
}
}
return 0;
}
int HK_maxMatch()
{
int ans=0,i;
memset(sx,-1,sizeof(sx));
memset(sy,-1,sizeof(sy));
while(bfs())
{
memset(p,0,sizeof(p));
for(i=1;i<=n;i++)
{
if(sx[i]==-1)
{
ans+=dfs(i);
}
}
}
return ans;
}
二分图最大匹配算法-Hopcroft-Karp模板
最新推荐文章于 2019-01-31 19:47:03 发布