[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年世界末日怎么办?我不知道该怎么做.但是现在科学家们已经发现,有些星球上的人可以生存,但有些人却不适合居住.现在科学家们需要你的帮助,就是确定所有人都能在这些行星上生活.输入多 ...
随机推荐
- Android手机号码不是所有的都能获取
手机号码不是所有的都能获取.只是有一部分可以拿到.这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码 ...
- IOS UITableView的分隔线多出问题
如题,有时显示UITableView多出部分在页面时,下面会显示处多出的行, 此时应该在UITableView初始化时设置为Group if (_tableView == nil) { _tableV ...
- ASP.NET读取EXCEL文件的三种经典方法(转)
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:public DataSet ExcelToDS(string Path) { str ...
- ZOJ 2672 Fibonacci Subsequence(动态规划+hash)
题意:在给定的数组里,寻找一个最长的序列,满足ai-2+ai-1=ai.并输出这个序列. 很容易想到一个DP方程 dp[i][j]=max(dp[k][i])+1. (a[k]+a[i]==a[j], ...
- WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件
动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName("Name") as 控 ...
- 黑马程序员——【Java基础】——Java概述
---------- android培训.java培训.期待与您交流! ---------- 一.Java语言概述及三大技术架构 1.Java语言概述 Java是SUN公司于1995年推出的一种面向I ...
- POJ 3278 经典BFS
进一步了解了bfs; 题意:给你n,然后用+,-,*三种运算使n变成k; 漏洞:在算出新的数字之后,一定要判边界,否则RE,而且在每一步后面都得加判断是否等于K,如果是即刻退出,否则WA,判这个的时候 ...
- windows操作系统的快捷键
编号:1015时间:2016年5月26日09:25:34功能:windows操作系统的快捷键URL:https://www.douban.com/group/topic/5937774/
- CentOS下启动Tomcat
http://tianlihu.iteye.com/blog/2010028 1. Tomcat的部署包存放的路径 /var/lib/tomcat6/webapps/ 2. Tomcat的配置文件路 ...
- SVM学习笔记
一.SVM概述 支持向量机(support vector machine)是一系列的监督学习算法,能用于分类.回归分析.原本的SVM是个二分类算法,通过引入“OVO”或者“OVR”可以扩展到多分类问题 ...