Escape

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 9430    Accepted Submission(s): 2234

Problem Description
2012 If this is the end of the world how to do? I do not know how. But now scientists have found that some stars, who can live, but some people do not fit to live some of the planet. Now scientists want your help, is to determine what all of people can live in these planets.

 
Input
More set of test data, the beginning of each data is n (1 <= n <= 100000), m (1 <= m <= 10) n indicate there n people on the earth, m representatives m planet, planet and people labels are from 0. Here are n lines, each line represents a suitable living conditions of people, each row has m digits, the ith digits is 1, said that a person is fit to live in the ith-planet, or is 0 for this person is not suitable for living in the ith planet.
The last line has m digits, the ith digit ai indicates the ith planet can contain ai people most..
0 <= ai <= 100000

 
Output
Determine whether all people can live up to these stars
If you can output YES, otherwise output NO.

 
Sample Input
1 1
1
1
 
2 2
1 0
1 0
1 1
 
Sample Output
YES
NO
 

题目链接:HDU 3605

比较入门的一道最大流,显然可以想到是超级源点S->人连一条为流量1的边;人->可达的星球连一条流量为1的边;星球->超级汇点T连一条容量为给定的星球容量的边。但是这样就超时了。

膜了一下正确的做法,因为星球数不超过10,显然一个人的选择状态最多$2^{10}=1024$种,然后就把状态代替了人,因此上面的建图中把人改为二进制的状压转化为10进制的数值i即可,当然与人有关的流量也不再是1,而是同一状态下的人数

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int S=1050;
struct edge
{
int to,nxt;
int cap;
};
edge E[S*23];
int head[S],tot;
bitset<S> vis;
int st[S]; void init()
{
CLR(head,-1);
tot=0;
CLR(st,0);
}
inline void add(int s,int t,int c)
{
E[tot].to=t;
E[tot].cap=c;
E[tot].nxt=head[s];
head[s]=tot++; E[tot].cap=0;
E[tot].to=s;
E[tot].nxt=head[t];
head[t]=tot++;
}
int dfs(int s,int t,int f)
{
if(s==t)
return f;
vis[s]=1;
for (int i=head[s]; ~i; i=E[i].nxt)
{
int v=E[i].to;
if(!vis[v]&&E[i].cap>0)
{
int d=dfs(v,t,min(f,E[i].cap));
if(d>0)
{
E[i].cap-=d;
E[i^1].cap+=d;
return d;
}
}
}
return 0;
}
int max_flow(int s,int t)
{
int ret=0;
int f;
while (true)
{
vis.reset();
f=dfs(s,t,INF);
if(!f)
break;
ret+=f;
}
return ret;
}
int main(void)
{
int n,m,i,j,c,s;
while (~scanf("%d%d",&n,&m))
{
init();
int S=0;
int T=(1<<m)+m;
for (i=1; i<=n; ++i)
{
int S=0;
for (j=0; j<m; ++j)
{
scanf("%d",&s);
if(s)
S|=(1<<j);
}
++st[S];
}
int R=1<<m;
for (i=1; i<R; ++i)
{
if(st[i])
{
add(S,i,st[i]);
for (j=0; j<m; ++j)
{
if(i&(1<<j))
add(i,R+j,st[i]);
}
}
}
for (i=0; i<m; ++i)
{
scanf("%d",&c);
add(R+i,T,c);
}
puts(max_flow(S,T)==n?"YES":"NO");
}
return 0;
}

HDU 3605 Escape(状压+最大流)的更多相关文章

  1. HDU - 3605 Escape (缩点+最大流/二分图多重匹配)

    题意:有N(1<=N<=1e5)个人要移民到M(1<=M<=10)个星球上,每个人有自己想去的星球,每个星球有最大承载人数.问这N个人能否移民成功. 分析:可以用最大流的思路求 ...

  2. HDU 3605 Escape (网络流,最大流,位运算压缩)

    HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...

  3. Hdu 3605 Escape (最大流 + 缩点)

    题目链接: Hdu 3605  Escape 题目描述: 有n个人要迁移到m个星球,每个星球有最大容量,每个人有喜欢的星球,问是否所有的人都能迁移成功? 解题思路: 正常情况下建图,不会爆内存,但是T ...

  4. HDU 3605 Escape 最大流+状压

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 2000/1000 MS (Java/Others)    ...

  5. HDU 4284Travel(状压DP)

    HDU 4284    Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...

  6. hdu 2209 bfs+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...

  7. hdu 5025 bfs+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 N*N矩阵 M个钥匙 K起点,T终点,S点需多花费1点且只需要一次,1-9表示9把钥匙,只有当前有I号钥匙 ...

  8. hdu 3605 Escape 二分图的多重匹配(匈牙利算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    ...

  9. HDU 4336 容斥原理 || 状压DP

    状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...

随机推荐

  1. T-SQL实用查询之常用SQL语句

    删除数据库所有的表: declare @sql varchar() begin SELECT @sql='drop table ' + name FROM sysobjects WHERE (type ...

  2. H5案例分享:移动端滑屏 touch事件

    移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch ...

  3. Nginx/Apache发大招

    导读 网站程序的上传目录通常是不需要PHP执行解释权限,通过限制目录的PHP执行权限可以提网站的安全性,减少被攻击的机率. 下面和大家一起分享下如何在Apache和Nginx禁止上传目录里PHP的执行 ...

  4. Java volatile的用法---转载

    我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步. 这在JVM 1.2之前,Java的内存模型实现总是从主 ...

  5. CF720F

    题目描述 给定1≤n≤100000,1≤k≤n(n-1)/2,和〈a_1, ... ,a_n〉,其中-50000≤a_i≤50000, 要求选出k个不同的子段,使得每个元素都被这些子段覆盖且这k个子段 ...

  6. PHP获取一年有几周以及每周开始日期和结束日期

    最近接了一个项目,其中有一需求是用php获取一年有几周以及每周开始日期和接触日期.在网上找些资料没有合适的,于是自己做了一份,下面通过两种方式实现PHP获取一年有几周以及每周开始日期和结束日期 代码一 ...

  7. 【GoLang】golang 的精髓--流水线,对现实世界的完美模拟

    直接上代码: package main import ( "fmt" "runtime" "strconv" "sync" ...

  8. strcmp

     C++ Code  123456789101112   int strcmp(const char *dest, const char *source) {     assert((NULL !=  ...

  9. C Primer Plus_第8章_字符输入输出和输入确认_编程练习

    1.题略 #include <stdio.h> int main(void) { ; printf("Please enter text here(end with Ctrl + ...

  10. Ubuntu 14.4 配置

    1.安装 Orcal Java 使用下面的命令安装,只需一些时间,它就会下载许多的文件,所及你要确保你的网络环境良好: sudo add-apt-repository ppa:webupd8team/ ...