二分圖最大匹配算法-Hopcroft-Karp模板

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章