[hdu 3605]Escape
这题的做法非常直观,却又非常不直观
先容许我吐一下槽吧~作者你的英语是读到火星上去了喵?
题目大体是说人类要移民,然后有 n 个人, m 个星球
每个人都有 m 个 0 、 1 数码表示他能否移民到该星球,每个星球有个最大人口容量
问是否有方案移民该 n 个人
乍一看很水,但是看看 n 的数据范围真是太感动人心了,有种这尼玛更本不是网络流的感脚——
但是 m 的范围只有 10 !直觉告诉我似乎可以动手脚的样子喵?
状压!因为不需要输出方案,所以两个可移民方案相同的人完全可以视为同一人
然后点就被压到了 1024 以内,妥妥地过掉了~
我才不会说我连边连错害我调了半小时呢喵
#include <cstdio>
#include <cstring>
#define min(x, y) ((x)<(y) ? (x):(y))
const int inf=0x7FFFFFFF;
const int sizeOfPoint=;
const int sizeOfEdge=; int n, m, t;
int S, T;
int f[sizeOfPoint], a[sizeOfPoint]; struct edge {int point, flow; edge * next, * pair;};
edge memory[sizeOfEdge], * port=memory;
edge * e[sizeOfPoint];
inline void clear() {port=memory; memset(e, , sizeof e); t=; memset(f, , sizeof f);}
inline edge * newedge(int point, int flow, edge * next) {edge * ret=port++; ret->point=point; ret->flow=flow; ret->next=next; ret->pair=NULL; return ret;}
inline void build(int u, int v, int f) {e[u]=newedge(v, f, e[u]); e[v]=newedge(u, , e[v]); e[u]->pair=e[v]; e[v]->pair=e[u];}
int h[sizeOfPoint];
inline bool bfs();
inline int aug();
inline int dinic(); int main()
{
int x, state; while (scanf("%d %d", &n, &m)!=EOF)
{
clear();
for (int i=;i<=n;i++)
{
state=;
for (int j=;j<m;j++)
{
scanf("%d", &x);
state|=x<<j;
}
if (!f[state]++) a[++t]=state;
}
S=; T=t+m+;
for (int i=;i<=t;i++)
{
build(S, i, f[a[i]]);
for (int j=;j<m;j++) if ((a[i]>>j)&)
build(i, t+j+, f[a[i]]);
}
for (int i=;i<=m;i++)
{
scanf("%d", &x);
build(t+i, T, x);
} if (dinic()==n) printf("YES\n");
else printf("NO\n");
} return ;
}
inline bool bfs()
{
static int q[sizeOfPoint];
int l=, r=;
memset(h, 0xFF, sizeof h); h[T]=;
for (q[r++]=T;l<r;l++)
{
int u=q[l];
for (edge * i=e[u];i;i=i->next) if (i->pair->flow && h[i->point]==-)
h[q[r++]=i->point]=h[u]+;
}
return h[S]>=;
}
inline int aug()
{
static edge * t[sizeOfPoint], * path[sizeOfPoint];
static int aug[sizeOfPoint];
int flow=; memcpy(t, e, sizeof e);
memset(path, , sizeof path);
memset(aug, , sizeof aug);
aug[S]=inf;
for (int u=S; ; )
{
if (u==T)
{
flow+=aug[T];
for (edge * i=path[T];i;i=path[i->point])
{
i->pair->flow-=aug[T], i->flow+=aug[T];
aug[i->point]-=aug[T];
if (!aug[i->point]) h[i->point]=-;
}
u=S;
} edge *& i=t[u];
for ( ;i && (!i->flow || h[u]!=h[i->point]+);i=i->next);
if (i)
{
path[i->point]=i->pair; aug[i->point]=min(aug[u], i->flow);
u=i->point; i=i->next;
}
else
{
if (u==S) break;
u=path[u]->point;
}
} return flow;
}
inline int dinic()
{
int ret=, flow;
while (bfs())
while (flow=aug())
ret+=flow;
return ret;
}
本傻调出翔系列
[hdu 3605]Escape的更多相关文章
- HDU 3605 Escape (网络流,最大流,位运算压缩)
HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...
- Hdu 3605 Escape (最大流 + 缩点)
题目链接: Hdu 3605 Escape 题目描述: 有n个人要迁移到m个星球,每个星球有最大容量,每个人有喜欢的星球,问是否所有的人都能迁移成功? 解题思路: 正常情况下建图,不会爆内存,但是T ...
- 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) ...
- hdu 3605 Escape 二分图的多重匹配(匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 3605 Escape(状态压缩+最大流)
http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意: 有n个人和m个星球,每个人可以去某些星球和不可以去某些星球,并且每个星球有最大居住人数,判断是否所 ...
- HDU 3605 Escape(二分图多重匹配问题)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- HDU - 3605 Escape (缩点+最大流/二分图多重匹配)
题意:有N(1<=N<=1e5)个人要移民到M(1<=M<=10)个星球上,每个人有自己想去的星球,每个星球有最大承载人数.问这N个人能否移民成功. 分析:可以用最大流的思路求 ...
- HDU 3605 Escape 最大流
题意: 如果这是2012年世界末日怎么办?我不知道该怎么做.但是现在科学家们已经发现,有些星球上的人可以生存,但有些人却不适合居住.现在科学家们需要你的帮助,就是确定所有人都能在这些行星上生活.输入多 ...
随机推荐
- S5PV210之beep-bus模型 linux3.0.8驱动
目录: 一. bus-driver-device模型 二. 运行结果,及错误解决 三. 怎样利用以有的driver device驱动来写自已的beep-driver-device 驱动 四 ...
- VMware-workstation-full-10.0.1-1379776 CN
从V10版本开始,VMware Workstation 官方自带简体中文了,以后大家不需要汉化啦! 今天,VMware Workstation 10.0.1正式发布,版本号为Build 1379776 ...
- PED结构获取进程路径和命令行地址
1.FS寄存器 2.进入FS寄存器地址,7FFDD000 3.偏移30为PED结构 4.偏移地址10 3C,44偏移:路径地址,命令行地址 // 通过PEB结构去查找所有进程模块 void *PEB ...
- UIkit框架介绍
UIKit Framework The UIKit framework (UIKit.framework) provides crucial infrastructure for implementi ...
- Qt调用WebService
从网上查找Qt调用WebService的方案,需要下载三方的类库,而且需要使用好几个控制台命令,才能生成代理客户端类.因为只是简单的测试,没有采用这种方式,直接使用HTTP的Get获取网站内容,也非常 ...
- UVA11624(bfs)
题意:给一张图,有火源,有障碍物,剩下的是道路,火源在下一分钟能够让上下左右四个方向的道路也着火,告诉人的位置,问最短时间能逃出去的时间是多少: 思路:一个bfs用来求出所有的火源能蔓延到的地方,另一 ...
- Unity3D ShaderLab 使用渐变纹理着色
Unity3D ShaderLab 使用渐变纹理着色 在我们编写着色器的过程中,还可以通过渐变纹理来控制漫反射的光照颜色.这种做法同样在VALVE的军团要塞2中及其流行. 前期,请准备一个渐变色的图片 ...
- mysql主从同步mysql slave_io_running:no的解决方案
在主从同步的时候出现slave_io_running:no 问题,于是查看mysqld.log日志,发现时1042错误 解决方案: 编辑/etc/my.cnf,在:[mysqld]内添加一行:skip ...
- java学习第八天
第九次课 目标 1. 多态 2. 抽象类 3. 接口 4. 内部类(了解) 一.多态polymorphism 追求”高内聚低耦合”通过三大特性: 封装继承及多态来实现. 多态:多种形态,”出去 ...
- vim-airline的theme
仓库位置: https://github.com/vim-airline/vim-airline-themes 这些内置的这些主题,可以直接使用,方法是在.vimrc中写 let g:airline_ ...