HDU 3605 Escape【二分图多重匹配】

题意:有 n 个人想移居到m 个星球,知道了每个人可以移居前往的星球和每个星球的人口容量,问是否所有人都能够成功迁移。
分析: 二分图多重匹配。
View Code
#include<stdio.h>
#include<string.h>
int cap[12]; //cap[i] 表示i点的匹配上限
int map[100002][12];
int vlink[12]; //vlink[i] 表示i点当前的匹配数
int link[12][100002]; //link[i][j] 表示与i点匹配好的第j个点
int v[12];
int n,m;
int find(int x)
{
int i,j;
for(i=0;i<m;i++)
{
if(map[x][i]&&!v[i])
{
v[i]=1;
if(vlink[i]<cap[i]) //i点的匹配数尚未达到上限,可直接匹配
{
link[i][vlink[i]++]=x; //x做为i的第vlink[i]个匹配点
return 1;
} //如果i点的匹配数已经达到上限,则遍历之前与i匹配的点
for(j=0;j<vlink[i];j++) //若它能与别的点匹配,则将位置让出来给 x
{
if(find(link[i][j])) //能与其他点匹配
{
link[i][j]=x; //让出位置给 x
return 1;
}
}
}
}
return 0;
}
int main()
{
int i,j,flag;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&map[i][j]);
for(i=0;i<m;i++)
scanf("%d",&cap[i]);
memset(vlink,0,sizeof(vlink));
flag=1;
for(i=0;i<n;i++)
{
memset(v,0,sizeof(v));
if(!find(i))
{
flag=0;
break;
}
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}
posted @ 2012-04-03 10:30  'wind  阅读(237)  评论(0编辑  收藏  举报