【最大流】Escape
https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/F
【题意】
给定n个人和m个星球,每个人可以匹配某些星球,每个星球有一定的容量限制,问能不能找出一种人和星球匹配的可行方案。
【思路】
裸的最大流。但人最多有1e5个,直接跑最大流会超时。但星球只有10个,所以一定有某些人对星球的选择是一模一样的,那么我们就可以状压缩点,缩到最多2^10=1024个。
【Accepted】
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e5+;
const int maxm=1e6;
const int inf=0x3f3f3f3f; struct Edge
{
int to,next,cap,flow;
}edge[maxm];
int tol;
int head[maxn];
int gap[maxn],dep[maxn],pre[maxn],cur[maxn];
int num[];
void init()
{
tol=;
memset(head,-,sizeof(head));
memset(num,,sizeof(num));
} void addedge(int u,int v,int w,int rw=)
{
edge[tol].to=v;
edge[tol].cap=w;
edge[tol].next=head[u];
edge[tol].flow=;
head[u]=tol++;
edge[tol].to=u;
edge[tol].cap=rw;
edge[tol].next=head[v];
edge[tol].flow=;
head[v]=tol++;
} int sap(int start,int end,int N)
{
memset(gap,,sizeof(gap));
memset(dep,,sizeof(dep));
memcpy(cur,head,sizeof(head));
int u=start;
pre[u]=-;
gap[]=N;
int ans=;
while(dep[start]<N)
{
if(u==end)
{
int Min=inf;
for(int i=pre[u];i!=-;i=pre[edge[i^].to])
{
if(Min>edge[i].cap-edge[i].flow)
{
Min=edge[i].cap-edge[i].flow;
}
}
for(int i=pre[u];i!=-;i=pre[edge[i^].to])
{
edge[i].flow+=Min;
edge[i^].flow-=Min;
}
u=start;
ans+=Min;
continue;
}
bool flag=false;
int v;
for(int i=cur[u];i!=-;i=edge[i].next)
{
v=edge[i].to;
if(edge[i].cap-edge[i].flow&&dep[v]+==dep[u])
{
flag=true;
cur[u]=pre[v]=i;
break;
}
}
if(flag)
{
u=v;
continue;
}
int Min=N;
for(int i=head[u];i!=-;i=edge[i].next)
{
if(edge[i].cap-edge[i].flow&&dep[edge[i].to]<Min)
{
Min=dep[edge[i].to];
cur[u]=i;
}
}
gap[dep[u]]--;
if(!gap[dep[u]])
{
return ans;
}
dep[u]=Min+;
gap[dep[u]]++;
if(u!=start)
{
u=edge[pre[u]^].to;
}
}
return ans;
}
int a[maxn];
int n,m;
int bit[]; int main()
{
bit[]=;
for(int i=;i<=;i++)
{
bit[i]=bit[i-]*;
}
while(~scanf("%d%d",&n,&m))
{
init();
int x;
for(int i=;i<=n;i++)
{
int temp=;
for(int k=;k<m;k++)
{
scanf("%d",&x);
if(x==)
{
temp+=bit[k];
}
}
num[temp]++;
}
int people=-inf;
for(int i=;i>=;i--)
{
if(num[i])
{
people=i;
break;
}
}
int planet=people+;
for(int i=;i<=;i++)
{
if(num[i]==)
{
continue;
}
addedge(,i,num[i]);
for(int k=;k<m;k++)
{
if(i&(<<k))
{
addedge(i,planet+k,num[i]);
}
}
}
for(int i=planet;i<planet+m;i++)
{
scanf("%d",&a[i]);
addedge(i,planet+m,a[i]);
} if(num[])
{
puts("NO");
continue;
}
int res=sap(,planet+m,planet+m+);
if(res==n)
{
puts("YES");
}
else
{
puts("NO");
}
getchar();
}
return ;
}
【最大流】Escape的更多相关文章
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- HDU 3605 Escape(状压+最大流)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
- HDU 3605 Escape (网络流,最大流,位运算压缩)
HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...
- HDU3605:Escape(状态压缩+最大流)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Hdu 3605 Escape (最大流 + 缩点)
题目链接: Hdu 3605 Escape 题目描述: 有n个人要迁移到m个星球,每个星球有最大容量,每个人有喜欢的星球,问是否所有的人都能迁移成功? 解题思路: 正常情况下建图,不会爆内存,但是T ...
- M - Escape - HDU 3605 - (缩点+最大流SAP)
题目大意:2012世界末日来了,科学家发现了一些星球可以转移人口,不过有的人可以在一些星球上生存有的人不行,而且每个星球都有一定的承载量,现在想知道是否所有的人都可以安全转移呢? 输入:首先输入一个N ...
- hdu3605 Escape 二分图多重匹配/最大流
2012 If this is the end of the world how to do? I do not know how. But now scientists have found tha ...
- Escape(状态压缩+最大流,好题)
Escape http://acm.hdu.edu.cn/showproblem.php?pid=3605 Time Limit: 4000/2000 MS (Java/Others) Memo ...
- HDU - 3605 Escape (缩点+最大流/二分图多重匹配)
题意:有N(1<=N<=1e5)个人要移民到M(1<=M<=10)个星球上,每个人有自己想去的星球,每个星球有最大承载人数.问这N个人能否移民成功. 分析:可以用最大流的思路求 ...
- HDU 3605 Escape 最大流+状压
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- [转]asp.net MVC helper 和自定义函数@functions小结
本文转自:http://www.cnblogs.com/jiagoushi/p/3904995.html asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的 ...
- ES之值类型以及堆和栈
ES的数据类型: 原始类型(值存在栈内存中): Number.String Boolean.undefined.null charAt(index)返回该index所在的字节,charCodeAt(i ...
- linux下安装xampp
Choose your flavor for your linux OS, the 32-bit or 64-bit version. Change the permissions to the in ...
- 掌握Spark机器学习库-07-随机梯度下降
1)何为随机梯度下降 优化方法 迭代更新,来寻找函数全局最优解的方法 与最小二乘法相比:适用于变量众多,模型更复杂 2)梯度 变化最快,“陡峭” 通过函数表达式来衡量梯度 3)随机梯度下降原理推导过程 ...
- php判断是否引入某文件
Code: /* 判断是否引入了公共文件demo.php */ $include_files = get_included_files(); $include_files_exist = 0 ; fo ...
- 这是一条立了Flag的不归路
时间2017年7月11日 14:48:40 首次激活博客园的博客来进行学习记录,立下了不算远大的小目标,下一步就是要一步一步的往前走. Java是目前最普遍的使用语言之一,作为一名测试,本应该去学习更 ...
- (转)Spring中的事务操作
http://blog.csdn.net/yerenyuan_pku/article/details/70024364 事务的回顾 什么是事务 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么 ...
- 安卓 Android 简单数据库(增删改查)
<Button android:id="@+id/delete_btn" android:layout_width="wrap_content" andr ...
- sql 语句的优化
sql语句的优化:在大多数情况下,为了更快的遍历表结构,优化器主要是根据定义的索引来提高性能.但是在不合理的SQL语句中,优化器会删去索引进而使用全表扫描, 一般而言,这种sql被称为劣质sql,所以 ...
- Python之__class__.__module__,__class__.__name__