题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605
题解:多重匹配即 X 集合上的点对应 Y 集合上多个点 而 Y 集合上的点对应 X 中的一个点。
#include <stdio.h>
#include <string.h>
#define MAXN 100001
int mp[MAXN][11],visited[11];
int capacity[11],num[11];
int match[11][MAXN],m;
int find(int x)
{
int i,j;
for(i=0;i<m;++i)
{
if(!visited[i]&&mp[x][i])
{
visited[i]=1;
if(num[i]<capacity[i])//i星球上的人数小于容量
{
match[i][num[i]++]=x;
return 1;
}
for(j=0;j<num[i];++j)
{
if(find(match[i][j]))
{
match[i][j]=x;
return 1;
}
}
}
}
return 0;
}
int Scan()
{
char ch;
int ret=0;
while((ch=getchar())<'0'||ch>'9');
while(ch>='0'&&ch<='9')
{
ret=ret*10+(ch-'0');
ch=getchar();
}
return ret;
}
int main()
{
int i,j,n,flag;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
mp[i][j]=Scan();
}
for(i=0;i<m;++i)
capacity[i]=Scan();
flag=1;
memset(num,0,sizeof(num));
for(i=0;i<n;++i)
{
memset(visited,0,sizeof(visited));
if(!find(i))
{
flag=0;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}