HDU 3605(多重最大匹配)

#include<stdio.h>
#include<string.h>
const int N=1e5+11,M=11;
int a[N][M],match[M][N],cnt[M],cap[M],p[M];
int n,m;
inline void in(int &res)
{
	char c;
	while((c=getchar())<'0'||c>'9');
	res=c-'0';
	while((c=getchar())>='0'&&c<='9')
		res=res*10+c-'0';
}
int dfs(int u)
{
	for(int i=1;i<=m;i++)
	{
		if(a[u][i]&&!p[i])
		{
			p[i]=1;
			if(cnt[i]<cap[i])
			{
				match[i][++cnt[i]]=u;
				return 1;
			}
			else
			{
				for(int j=1;j<=cap[i];j++)
				{
					if(dfs(match[i][j]))
					{
						match[i][j]=u;
						return 1;
					}
				}
			}
		}
	}
	return 0;
}
int maxmatch()
{
	memset(cnt,0,sizeof(cnt));
	memset(match,-1,sizeof(match));
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		memset(p,0,sizeof(p));
		if(dfs(i))
			ans++;
		else
			return 0;
	}
	return ans;
}
int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				in(a[i][j]);
			}
		}
		for(int j=1;j<=m;j++)
			in(cap[j]);
		printf("%s\n",maxmatch()==n?"YES":"NO");
	}
	return 0;
}

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