HDU3605 Escape(最大流判满流 + 状压)
【题意】:
有N个人,M个星球,给N*M矩阵,(i, j)为1代表i可以到j星球,0代表不能,问是否能把所有人转移走。
【思路】:
N的范围为1e6,如果让每个人与星球连边一定TLE,再根据矩阵每一行只有0,1可以进行状压,把相同状态idx的人合并到数组siz[idx],
在扫描状态,与符合条件的星球连边。
【建图】:
超级源点sp -> idx 边权siz[idx]
idx -> M 边权inf
M -> 超级汇点tp 边权为容量

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e5 + ;
const int maxm = + ;
const int inf = 0x3f3f3f3f;
int n, m, d[maxn+maxm], siz[maxn];
int head[maxn+maxm], tot, maxflow;
int sp, tp;
struct edge{
int to, w, next;
} ed[(maxn*maxm+maxn+maxm)<<];
inline void init(){
memset( head ,-, sizeof(head) );
memset( siz, , sizeof(siz) );
tot = ;
} inline void add( int u, int v, int w ){
ed[++tot].to = v; ed[tot].w = w; ed[tot].next = head[u]; head[u] = tot;
ed[++tot].to = u; ed[tot].w = ; ed[tot].next = head[v]; head[v] = tot;
} inline bool bfs(){
memset( d, , sizeof(d) );
queue<int> q;
d[sp] = ;
q.push(sp);
while( !q.empty() ){
int x = q.front();
q.pop();
for( int i=head[x]; i!=-; i=ed[i].next ){
int y = ed[i].to;
if( ed[i].w && !d[y] ){
d[y] = d[x] + ;
q.push(y);
if( y==tp ) return ;
}
}
}
return ;
} inline int dfs( int x, int flow ){
if( x==tp ) return flow;
int res = flow, k;
for( int i=head[x]; i!=- && res; i=ed[i].next ){
int y = ed[i].to;
if( ed[i].w && d[y]==d[x]+ ){
k = dfs( y, min( ed[i].w, res ) );
if(!k) d[y] = ;
ed[i].w -= k;
ed[i^].w += k;
res -= k;
}
}
return flow-res;
} inline void dinic(){
int flow = maxflow = ;
while( bfs() )
while( flow=dfs(sp, inf) ) maxflow += flow;
} int main(){
// freopen("in.txt", "r", stdin);
while( ~scanf("%d%d", &n, &m) ){
init();
int l = inf, r = -inf;
for( int i=; i<=n; i++ ){
int sum = ;
for( int j=; j<=m; j++ ){
int tmp;
scanf("%d", &tmp);
sum <<= ;
sum += tmp;
}
siz[sum] ++;
l = min( l, sum ); r = max( r, sum );
}
sp = ;
tp = r+m+;
for( int i=; i<=m; i++ ){
int cont;
scanf("%d", &cont);
add( i+r, tp, cont );
}
for( int i=l; i<=r; i++ )
if( siz[i] ){
int pos = ;
while( pos<m ){
if( i&(<<pos) ) add( i, m-pos+r, inf );
pos ++;
}
add( sp, i, siz[i] );
}
dinic();
if( n<=maxflow ) puts("YES");
else puts("NO");
} return ;
}
HDU3605 Escape(最大流判满流 + 状压)的更多相关文章
- 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 ...
- hdu 3572 最大流判断满流
#include<stdio.h> #include<string.h> #include<queue> using namespace std; #define ...
- HDU2883 kebab(最大流判断满流 + 离散化 + 区间化点)
[题意]: 有一个烤箱,烤箱在一个时刻最多考M个肉串,N个顾客,每个顾客有属性s,n,e,t s是来的时间,n是想要的肉串数量,e是最晚离开的时间,t是烤的时间(几分熟). 顾客的烤肉可以分开烤,比如 ...
- HDU 4888 Redraw Beautiful Drawings(最大流+判最大流网络是否唯一)
Problem Description Alice and Bob are playing together. Alice is crazy about art and she has visited ...
- HDU 3572 Task Schedule(最大流判断满流)
https://vjudge.net/problem/HDU-3572 题意: 有N个作业和M台机器,每个作业都有一个持续时间P,工作的日期为S~E.作业可以断断续续的在不同机器上做,每台机器每次只可 ...
- hdu-3572 Task Schedule---最大流判断满流+dinic算法
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...
- hdu3572 任务分配/最大流判断满流
题意:将n个任务分配为m个机器,给每个任务需要的天数(无需每天连续),和可以在哪些天去做该任务,求是否存在方案. 典型的任务(X)----天(Y)二分最大流,(因为这里任务是与天的关系)处理器控制流量 ...
- HDU 3605 Escape(状压+最大流)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
- HDU 3605 Escape 最大流+状压
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- 解决coursera笔记本(ipynb)打不开的问题
最近在coursera听课,发现notebook打不开,一直显示加载中. 想到了可能被墙,苦于没有梯子.最后F12,发现有报错 Failed to load resource: net::ERR_CO ...
- 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?(阿里面试)
JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈.方法区等介绍的比较清楚. 上图,是一张在作者根据<Java虚拟机规范(Java SE 8)>中描述的J ...
- CentOS安装Hive
1.环境和软件准备: hive版本:apache-hive-2.3.6-bin.tar.gz,下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hive ...
- php Access-Control-Allow-Origin 解决跨域问题
第1种 在代码里面加 header信息(推荐) header("Access-Control-Allow-Origin: *"); //如果需要设置允许所有域名发起的跨域请求,可以 ...
- shell三剑客之grep
背景 对于很多的测试人员来说,grep命令都很熟悉,用的最多的比如去查找指定的进程:ps -ef | grep *** ,其中***为进程名或进程号,这里我们只用到的grep的最基础功能-从标准输出中 ...
- LinkedHashMap源码
TreeMap是一颗红黑树做Map.HashMap是数组+链表+红黑树.HashTable是数组+链表. LinkedHashMap底层存储结构与HashMap一样,不同的是LinkedHashMap ...
- DIY Images
正如你想到的,我们当然也想自己做一个属于自己的特别的图案吧. 其实很简单 25个中每一个led灯都是可以单独控制的,每一个灯都设10个级别,如果设置在0,则不发光,如果设置为9,则是最亮,1~8,则是 ...
- [转帖]direct path read直接路径读
direct path read直接路径读 http://blog.itpub.net/12679300/viewspace-1188072/ 原创 Oracle 作者:wzq609 时间:2014- ...
- C库函数strstr分析
C标准库<string.h> 函数声明: char* strstr(char* const _String, char const* const _SubString) 返回值: SubS ...
- 【简记】修改Docker数据目录位置,包含镜像位置
为啥要改? Docker安装后默认下载的位置在/var/lib/docker ,如果/var分区没有独立分出来,Linux下默认是与/根分区在一起.一般我们装Linux系统的时候,除了做邮件服务器外, ...