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 数码表示他能否移民到该 ...
随机推荐
- .NET探索平台条件编译
前言 今天偶然机会,翻了一下大学期间的书籍<C程序设计>,好吧,当我翻着翻着,翻到了符号常量(#define指令)中,是啊,这是一个预处理器指令,记得在Magicodes.IE中针对平台选 ...
- java中如何踢人下线?封禁某个账号后使其会话立即掉线!
需求场景 封禁账号是一个比较常见的业务需求,尤其是在论坛.社区类型的项目中,当出现了违规用户时我们需要将其账号立即封禁. 常规的设计思路是:在设计用户表时增加一个状态字段,例如:status,其值为1 ...
- SQL Server management studio使用sa连接时报错与伺服器的连接已成功,但在登入程序是发生错误
使用Sql Server management studio的sa用户连接数据库时,报如下错误 解决方法: 1.使用windows验证登录 2.右键点击连接,点击属性,点击安全性,选择混合验证 3.重 ...
- 如何创建一个 PostgreSQL 数据库?
PostgreSQL 官网截图 PostgreSQL 是什么? PostgreSQL 是一个功能非常强大的,历史悠久,开源的关系数据库.PostgreSQL支持大部分的SQL标准并且提供了很多其他现代 ...
- Mybatis执行流程学习之手写mybatis雏形
Mybatis是目前开发中最常用的一款基于ORM思想的半自动持久层框架,平时我们都仅仅停留在使用阶段,对mybatis是怎样运行的并不清楚,今天抽空找到一些资料自学了一波,自己写了一个mybatis的 ...
- InnoDB事务篇
1.解决数据更新丢失的问题 1)LBCC:基于锁的并发控制.让操作串行化执行.效率低. 2)MVCC:基于版本的并发控制.使用快照形式.效率高.读写不冲突.主流数据库都是使用的MVCC. 2.Inno ...
- Java基础复习2
三目运算符 语法:条件判断?表达式1:表达式2; 如果条件判断成立则获取值1否则获取值2 public class demo1{ public static void main(String[ ...
- Hive常用性能优化方法实践全面总结
Apache Hive作为处理大数据量的大数据领域数据建设核心工具,数据量往往不是影响Hive执行效率的核心因素,数据倾斜.job数分配的不合理.磁盘或网络I/O过高.MapReduce配置的不合理等 ...
- uni-app 获取地址位置
uni.getLocation 获取当前的地理位置.速度. 在微信小程序中,当用户离开应用后,此接口无法调用:当用户点击"显示在聊天顶部"时,此接口可继续调用 uni.getLoc ...
- jQ实现图片无缝轮播
在铺页面的过程中,总是会遇到轮播图需要处理,一般我是会用swiper来制作,但总会有哪个几个个例需要我自己来写功能,这里制作了一个jq用来实现图片无缝轮播的dome,分享给大家ヽ( ̄▽ ̄)ノ. dom ...