题目链接: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;
}
本文探讨了多重匹配问题的解决方法,通过使用多重匹配算法实现了X集合与Y集合之间的高效对应,确保了每个X集合的点都能找到Y集合中对应的多个点,反之亦然。该算法采用深度优先搜索策略,利用visited数组标记已访问过的节点,通过mp数组记录匹配关系,最终通过find函数实现匹配过程。在输入包含星系人数与星球容量的数据后,程序能够判断是否能完成所有星系与星球之间的完美匹配,并输出相应的YES或NO结果。

4054

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



