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;
}
题意:有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;
}
相关文章推荐
- hdu 3605 Escape(最大流+状态压缩 or 二分图多重匹配)
- hdu 3605 Escape【二分图多重匹配】
- HDU 3605 Escape【二分图多重匹配】
- hdu 3605 Escape 二分图的多重匹配(匈牙利算法)
- HDU 3605 Escape【二分图多重匹配】
- hdu 3605 Escape(二分图多重匹配问题)
- HDU 3605 Escape (二分图的多重匹配)
- hdu 3605 Escape (二分图多重匹配)
- HDU 3605 Escape (二分图多重匹配模板)
- hdu 3605 Escape/poj 2584 T-Shirt Gumbo(二分图多重匹配)
- hdu 3605 Escape (二分图多重匹配)
- HDU 3605 Escape 最大流or二分图多重匹配 2010 ACM-ICPC Multi-University Training Contest(17)——Host by ZSTU
- HDU 3605 Escape(网络流 + 状压简化 | 二分图多重匹配)
- hdu 3605 Escape 二分图的多重匹配(匈牙利算法)
- hdu_3605 Escape 二分图的多重匹配 匈牙利算法
- HDU 3605 Escape【二分图多重匹配】
- HDU 3605 Escape (二分图多重匹配模板)
- 二分图匹配 ( 多重匹配&&Hungarian)——Escape ( HDU 3605 )
- HDU 3605 Escape 【二分匹配之多重匹配】
- HDU_3605_Escape(多重匹配 / 网络流)