这题的做法非常直观,却又非常不直观

先容许我吐一下槽吧~作者你的英语是读到火星上去了喵?

题目大体是说人类要移民,然后有 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的更多相关文章

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

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

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

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

  3. HDU 3605 Escape(状压+最大流)

    Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  4. HDU 3605 Escape 最大流+状压

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

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

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

  6. HDU 3605 Escape(状态压缩+最大流)

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意: 有n个人和m个星球,每个人可以去某些星球和不可以去某些星球,并且每个星球有最大居住人数,判断是否所 ...

  7. HDU 3605 Escape(二分图多重匹配问题)

    Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

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

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

  9. HDU 3605 Escape 最大流

    题意: 如果这是2012年世界末日怎么办?我不知道该怎么做.但是现在科学家们已经发现,有些星球上的人可以生存,但有些人却不适合居住.现在科学家们需要你的帮助,就是确定所有人都能在这些行星上生活.输入多 ...

随机推荐

  1. xlistview的XML(头)xlistview_header

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  2. matlab和C/C++混合编程--Mex (六)参数传递

    最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...

  3. iOS开发中关于nslog的几种流行做法小结

    不管哪种方法,都必须在PCH文件中做下宏定义 DEBUG和RELEASE要分开,RELEASE时log打印要取消 方法一:简单直接,用几行代码搞定,简洁但功能少 #ifdef DEBUG #defin ...

  4. Typographical Concepts

    Glyph(字形) A glyph is an element of writing: an individual mark on a written medium that contributes ...

  5. 转 15款免费WiFi(入侵破解)安全测试工具

    转:http://www.ctocio.com/security/cloudsecurity/6594.html 一.Vistumbler扫描器 WiFi 扫描器能能发现附近AP的详细信息,例如信号强 ...

  6. 知道创宇CTO杨冀龙:网络安全人才决定行业格局

    去年的时候,我曾经在团队内部分享了一个“网络安全人才迁徙图”,被圈子里的同行广为传播.几乎所有行业的安全人士都表示:国内网络安全行业人才资源情况并不乐观——有着10年以上网络安全行业经验的核心安全人才 ...

  7. simtrace之探秘SIM卡中的世界

    0×00 关于SIM卡 众所周知SIM卡是一张插在手机上的小卡,其全称为Subscriber Identity Module 客户识别模块.不过,这个世界上并没有多少人知道SIM卡中的操作系统是基于j ...

  8. Android 编译Settings、Mms等模块,并Push到手机中安装失败

    问题描述:在编译完Settings等相关模块后,并push到手机中安装失败(在手机中无法找到该应用),但是使用adb shell命令进入到手机中在System/app或者System/priv-app ...

  9. Ubuntu 重新设置网络

    sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service ...

  10. Ubuntu 开启ssh

    sudo apt-get install openssh-server Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可 ...