HDU 3605 Escape 最大流
题意:
如果这是2012年世界末日怎么办?我不知道该怎么做。但是现在科学家们已经发现,有些星球上的人可以生存,但有些人却不适合居住。现在科学家们需要你的帮助,就是确定所有人都能在这些行星上生活。输入多组测试数据,每组数据的开头是n (1 <= n <= 100000), m (1 <= m <= 10) n表示地球上有n个人,m代表m星球,星球和人的标签都是从0开始的。这里有n行,每一行代表一个合适的居住条件的人,每一行有m个数字,第i个数字是1,表示一个人适合居住在第i个星球上,或者是0表示这个人不适合居住在第i个星球上。最后一行有m个数字,第i个数字ai表示第i个星球最能容纳ai人。0 <= ai <= 100000输出确定是否所有人都能达到这些标准如果可以输出YES,则输出NO。
代码:
1 //这道题一看见是一个最大流模板,但是这道题就是为了卡时间。。。
2 //因为题目上面n特别大,这个时候因为m只有10,此时最大也就只有2^10个选择,所以有好多人的选择是一样的
3 //那么我们要按照他们的选择来建图,这样的话边的数量就会大大减少
4 #include<stdio.h>
5 #include<string.h>
6 #include<iostream>
7 #include<algorithm>
8 #include<queue>
9 #include<math.h>
10 #include<stdlib.h>
11 #include<vector>
12 using namespace std;
13 const int maxn=200005;
14 const int INF=0x3f3f3f3f;
15 int head[maxn],cnt,st,en,dis[maxn],cur[maxn],v[maxn];
16 struct edge
17 {
18 int v,next,c,flow;
19 } e[1000005];
20 vector<int> state[maxn];
21 void add_edge(int x,int y,int z)
22 {
23 e[cnt].v=y;
24 e[cnt].c=z;
25 e[cnt].flow=0;
26 e[cnt].next=head[x];
27 head[x]=cnt++;
28
29 e[cnt].v=x;
30 e[cnt].c=z;
31 e[cnt].flow=0;
32 e[cnt].next=head[y];
33 head[y]=cnt++;
34 }
35 bool bfs()
36 {
37 memset(dis,0,sizeof(dis));
38 dis[st]=1;
39 queue<int>r;
40 r.push(st);
41 while(!r.empty())
42 {
43 int x=r.front();
44 r.pop();
45 for(int i=head[x]; i!=-1; i=e[i].next)
46 {
47 int v=e[i].v;
48 if(!dis[v] && e[i].c>e[i].flow)
49 {
50 dis[v]=dis[x]+1;
51 r.push(v);
52 }
53 }
54 }
55 return dis[en];
56 }
57 int dinic(int s,int limit)
58 {
59 if(s==en || !limit) return limit;
60 int ans=0;
61 for(int &i=cur[s]; i!=-1; i=e[i].next)
62 {
63 int v=e[i].v,feed;
64 if(dis[v]!=dis[s]+1) continue;
65 feed=dinic(v,min(limit,e[i].c-e[i].flow));
66 if(feed)
67 {
68 e[i].flow+=feed;
69 e[i^1].flow-=feed;
70 limit-=feed;
71 ans+=feed;
72 if(limit==0) break;
73 }
74 }
75 if(!ans) dis[s]=-1;
76 return ans;
77 }
78 int main()
79 {
80 int n,m;
81 char s[25][25];
82 int w[25][25];
83 while(~scanf("%d%d",&n,&m))
84 {
85 memset(head,-1,sizeof(head));
86 cnt=0;
87 int x;
88 st=0;
89 en=1024+2*m+1;
90 memset(v,0,sizeof(v));
91 // for(int i=1;i<=n;++i) //这种方法建图的时候它的终止点en要大于1024,这样的话跑的话太慢了
92 // { //所以这个时候en的大小要改变成n+m+1,这个时候就要用到n了,正确建图方式见下面
93 // int y=1,sum=0;
94 // for(int j=1;j<=m;++j)
95 // {
96 // scanf("%d",&x);
97 // if(x)
98 // {
99 // sum+=y;
100 // }
101 // y*=2;
102 // }
103 // v[sum]++;
104 // }
105 // if(v[0])
106 // {
107 // printf("NO\n");
108 // continue;
109 // }
110 // for(int i=1;i<=1024;++i)
111 // {
112 // if(v[i])
113 // {
114 // add_edge(st,i,v[i]);
115 // add_edge(i,st,0);
116 // }
117 // for(int j=0;j<m;++j)
118 // {
119 // if((1<<j)&i)
120 // {
121 // add_edge(i,1024+1+j,INF);
122 // add_edge(1024+1+j,i,0);
123 // }
124 // }
125 // }
126 // for(int i=1;i<=m;++i)
127 // {
128 // scanf("%d",&x);
129 // add_edge(1024+i,en,x);
130 // add_edge(en,1024+i,0);
131 // }
132 st=0,en=n+m+1;
133 int s,i,j,num; //因此用状态压缩进行缩点
134 for(i=0; i<=1024; i++)
135 state[i].clear();
136 for(i=1; i<=n; i++)
137 {
138 s=0;
139 for(j=0; j<m; j++)
140 {
141 scanf("%d",&num);
142 if(num==1)
143 s|=(1<<j); //C语言中的 |= 意思为:按位或后赋值
144 }
145 state[s].push_back(i);
146 } //缩点
147 int tmp,siz;
148 for(i=0; i<(1<<m); i++) //这点就比我原来的代码优化了
149 {
150 if(state[i].size()==0)
151 continue;
152 tmp=state[i][0];
153 siz=state[i].size();
154 add_edge(st,tmp,siz);
155 for(j=0; j<m; j++) //由原来容量为1改为缩点的个数
156 if(i&(1<<j))
157 add_edge(tmp,n+j+1,siz);
158 }
159 for(i=1; i<=m; i++)
160 {
161 scanf("%d",&num);
162 add_edge(i+n,en,num);
163 }
164
165 int ans=0;
166 while(bfs())
167 {
168 for(int i=0; i<=en; i++)
169 cur[i]=head[i];
170 ans+=dinic(st,INF);
171 }
172 if(ans==n)
173 {
174 printf("YES\n");
175 }
176 else printf("NO\n");
177 }
178 return 0;
179 }
HDU 3605 Escape 最大流的更多相关文章
- Hdu 3605 Escape (最大流 + 缩点)
题目链接: Hdu 3605 Escape 题目描述: 有n个人要迁移到m个星球,每个星球有最大容量,每个人有喜欢的星球,问是否所有的人都能迁移成功? 解题思路: 正常情况下建图,不会爆内存,但是T ...
- HDU 3605 Escape 最大流+状压
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 2000/1000 MS (Java/Others) ...
- 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(状压+最大流)
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: 4000/2000 MS (Java/Others) ...
- HDU 3605 Escape(状态压缩+最大流)
http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意: 有n个人和m个星球,每个人可以去某些星球和不可以去某些星球,并且每个星球有最大居住人数,判断是否所 ...
- HDU - 3605 Escape (缩点+最大流/二分图多重匹配)
题意:有N(1<=N<=1e5)个人要移民到M(1<=M<=10)个星球上,每个人有自己想去的星球,每个星球有最大承载人数.问这N个人能否移民成功. 分析:可以用最大流的思路求 ...
- HDU 3605 Escape(二分图多重匹配问题)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- [hdu 3605]Escape
这题的做法非常直观,却又非常不直观 先容许我吐一下槽吧~作者你的英语是读到火星上去了喵? 题目大体是说人类要移民,然后有 n 个人, m 个星球 每个人都有 m 个 0 . 1 数码表示他能否移民到该 ...
随机推荐
- HAProxy + keepalived 高可用集群代理
HAProxy + keepalived # 1 安装keepalived: yum install keepalived -y # 2 修改KEEPalived配置文件: vim /etc/keep ...
- 面试官:Netty的线程模型可不只是主从多Reactor这么简单
笔者看来Netty的内核主要包括如下图三个部分: 其各个核心模块主要的职责如下: 内存管理 主要提高高效的内存管理,包含内存分配,内存回收. 网通通道 复制网络通信,例如实现对NIO.OIO等底层JA ...
- 【ORACLE】11g rac+dg
首先感谢群友分享的文档,在这里先感谢哆啦B梦,非常感谢 该文档主要指导如何利用现有的RAC环境搭建一套RAC与单实例的DG的环境 ============================主机配置信息 ...
- Ubuntu下修改缺省dash shell为bash shell
Debian和Ubuntu下缺省使用的是shell是dash,而不是bash.从/bin/sh软连接的指向可以看出这点. 这是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它 ...
- 国人之光:大数据分析神器Apache Kylin
一.简介 Apache Kylin是一个开源的.分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献 ...
- MongoDB数据库,一些的筛选过滤查询操作和db.updae()更新数据库记录遇到的坑。
缘由:使用MongoDB时遇到一些需要查询/更新操作指定某些字段的业务场景 查询和更新指定字段就需要进行简单的筛选和过滤,也能在大数据量时减少查询消耗时间 1. 查询数据库某些指定字段,同时默认返回_ ...
- 小白也能看懂的ACID与隔离级别
前言 现如今JAVA开发工程师的数量越来越多,但大多数工程师平时做的工作都是简单的CRUD,当你一直处于这种舒适的环境中不追求进步的时候,如果哪一天你突然想要改变环境,换个工作,去与面试官当面聊技术的 ...
- h3c交换机配置ssh密码验证登录方式
一.背景: 1.由于PC机串口不支持热插拔,请不要在交换机带电的情况下,将串口插入或者拔出PC机.当连接PC和交换机时,请先安装配置电缆的DB-9端到PC机,再连接RJ-45到交换机:在拆下时,先拔出 ...
- Golang 性能优化实战
小结: 1. 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解. 代码逻辑层面的走读非常重要,要尽量避免无效逻辑. 对于 golang 自身库存在缺陷的,可以寻 ...
- 微服务中台落地 中台误区 当中台遇上DDD,我们该如何设计微服务
小结: 1. 微服务中台不是 /1堆砌技术组件就是中台 /2拥有服务治理就是中台 /3增加部分业务功能就是中台 /4Cloud Native 就是中台 https://mp.weixin.qq.com ...