您的位置:首页 > 其它

hdu 3605 Escape (二分图的多重匹配)

2014-08-04 19:41 363 查看
hdu 3605 Escape (二分图的多重匹配)

题意:有m个星球(m<=10),现在有n(n<10w),有些人适合住在一部分星球上,每个星球可以容纳a[i](<100000 )个人,问能否安排所有的人?

题解:典型的二分多重匹配;

注意:(1) 开数组的时候,用link[x][y] 记录第x个星球居住的人!一开始数组开反了,一直WA!!

           (2) 后来搞个输入优化,忘了ret=ret*10+(c-'0');
忘了乘10!!晕!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
#define LL long long
#define N 100005
#define M 12
#define DEBUG puts("It's here!")
#define INF 1<<29
#define CLS(x,v) memset(x,v,sizeof(x))
#define FOR(i,a,n) for(int i=(a);i<=(n);++i)

int n,m;
int graph
[M];
bool vis[M];
vector<int> link[M];//记录第i个星球上住的人
int cap[M];//第i个星球上最多住多少人
int DFS(int x)
{
for(int i=1;i<=m;i++)//m个星球
if(!vis[i]&&graph[x][i])//还没住满
{
vis[i]=1;
if(link[i].size()<cap[i])
{
link[i].push_back(x);return 1;
}
for(int k=0;k<link[i].size();k++)
{
if(DFS(link[i][k]))//让别人去住别的星球
{
link[i][k]=x;return 1;
}
}
}
return 0;
}
int input()
{
int ret=0;
char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')
{
ret=ret*10+c-'0';//
c=getchar();
}
return ret;
}
int main()
{

while(~scanf("%d%d",&n,&m))
{
FOR(i,1,m)link[i].clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
//scanf("%d",&graph[i][j]);
graph[i][j]=input();
}
FOR(i,1,m)cap[i]=input();
int cnt=0;
for(int i=1;i<=n;i++)
{
CLS(vis,0);
if(DFS(i))cnt++;
else break;
}
if(cnt==n)puts("YES");
else puts("NO");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: