网络流
Hanks_o
一名。
展开
-
有源汇有上下界最小流详解(loj117)
例题链接 首先还是得吐槽一下题意。 题意是这样的: 求出一个流使得源点的总流出量等于汇点的总流入量,其他的点满足流量守恒,而且每条边的流量满足上界和下界限制。在这些前提下要求总流量最小。解法: 没学过无源汇有上下界可行流的还是先学学吧好像是有两种做法的。 做法1: 首先先求出可行流,按照上一篇博客的做法即可。 上一篇博客 很明显现在已经满足下界了,那么我们只需在残量网络上求出最小流即原创 2017-09-15 20:44:48 · 3184 阅读 · 4 评论 -
bzoj1475: 方格取数(最小割)
题目传送门 水。。解法: 没有公共边也就是格子不相邻。 那么把整个图黑白染色。 相邻的颜色不一样。 那么就最小割呗。 把所有点个成两个集合。一个黑色点的集合,一个白色点的集合。 黑色点都没有公共边白色点也没有公共点。 好水的最小割做完前面的题发现这道才是最水的。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#inc原创 2017-12-29 13:15:28 · 392 阅读 · 0 评论 -
bzoj1934: [Shoi2007]Vote 善意的投票(最小割)
题目传送门 做网络流快疯了。解法: 好水。。 明显的最小割嘛。。 本来同意的连st容量为1 本来不同意的连ed容量为1。 然后图中的边就互相连嘛。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<queue>#include<原创 2017-12-29 13:34:37 · 242 阅读 · 0 评论 -
bzoj1458: 士兵占领(最小割)
题目传送门解法: 好水的最小割。不就是套路吗。。。 首先先把所有的行跟列加起来。 因为你最多最多只需要这么多啊。 然后一个士兵可能会有两次贡献(一次行,一次列) 就相当于找尽量多的贡献为2的士兵。 按照这个图去建最小割即可。代码实现:#include#include#include#include#include#include#includeusing原创 2018-01-16 16:57:58 · 367 阅读 · 0 评论 -
bzoj1305: [CQOI2009]dance跳舞(网络流)
题目传送门 。解法: 挺水的最大流啊。 拆点一个控制连喜欢的一个控制连不喜欢的。 第一个点向第二个点连容量为k的边表示只能选k个不喜欢的。。 然后建完图我高兴的以为又a了一题。结果wa了。 静下来想想发现别人找到四个伴侣我可能只找到两个。 这样的话是不行的。 所以二分规定放多少首歌。 然后从st只流出这么多的流量。如果满流,说明这个歌的数量可以满足。代码实现:#i...原创 2018-03-06 21:19:15 · 216 阅读 · 0 评论 -
bzoj2424: [HAOI2010]订货(费用流)
题目传送门 一个月没做题模板都打不好了。。解法: 肉dalao推荐的题。 一眼网络流结果肉dalao用的是Dp哇orz%%% 那我只好网络流咯。 st向每一个月进货。容量为无限费用为每个月的单价。很显然。 这个月可以储存到下个月。那么往下个月连边,费用为m容量为S。显然。 出货每个月往ed连容量为每个月所需费用为0的边,显然。代码实现:#include<cstd...原创 2018-02-27 13:36:30 · 239 阅读 · 0 评论 -
bzoj4808: 马(最小割)
题目传送门 。解法: 蛮水的最小割。 黑白染色 首先利用黑白染色将相邻点染不同颜色。 然后就会发现马步能跳到的点一定是不同的颜色。 然后就st向白点连1。 黑点向ed连1。 图中的马步白点向黑点连无限就好啦。 最小割经典模型吧我觉得。 最后用sum-最小割就完了呗。代码实现:#include<cstdio>#include<cstring&g...原创 2018-03-16 22:19:48 · 402 阅读 · 2 评论 -
bzoj3175: [Tjoi2013]攻击装置(最小割)
题目传送门 。双倍经验 http://blog.csdn.net/hanks_o/article/details/79587664#comments原创 2018-03-17 11:52:09 · 257 阅读 · 0 评论 -
bzoj4514: [Sdoi2016]数字配对(费用流)
题目传送门 。解法: 哇跟网上做法完全不一样诶。 我本来是这样想的。 分成两排点,都是1~n。 能连的话第一排连第二排。 这样的话出现了一个问题。如果第二个数字只能用一次。 第一个数字去跟第二个数字匹配。第二个数字去跟第三个数字匹配。 这种情况我无法限制。然后。我就想到一个比较讨巧的方法。 还是两排。 能连的话第一排连第二排。然后反过来的也要连。 这样的话就不会出现上...原创 2018-03-05 20:57:07 · 242 阅读 · 0 评论 -
bzoj2756: [SCOI2012]奇怪的游戏(最大流)
题目传送门 。解法: 很神啊。 首先将图黑白染色。相邻点不同颜色。 那么每一次操作黑色点和白色点同时都要+1c1表示白色点数量。s1表示白色点总和。 c2,s2表示黑色。 因为每次操作黑白加的是一样的。 设最后都变成x。 那么有c1*x-s1=c2*x-s2 化简得x=(s1-s2)/(c1-c2)分情况讨论: 如果c1=c2。 那么s1!=s2的时候无解。 当...原创 2018-03-29 20:26:04 · 353 阅读 · 0 评论 -
bzoj3504: [Cqoi2014]危桥(最大流)
题目传送门 。解法: 一看到这题。 大喊一声“不是建完图跑一下网络流吗” 朱老师走过来拍了拍我:如果a1流到b2呢,反过来就行了。。 反过来??什么鬼?? emmmm好吧然后我弃疗了去颓了。又看到这题了。。 什么鬼啊。。 反过来?? 哦反过来。。 反过来好像行。。 那么正常建完图之后呢。 再把b1b2反过来就行了啊。 如果原来串流了。那么反过来肯定不会串流。代...原创 2018-03-24 20:37:55 · 219 阅读 · 0 评论 -
bzoj3442: 学习小组(费用流)
题目传送门 。解法: 建图蛮好想的其实。 设s表示该学生最多可以选多少个小组。 有可能小于k st向每个学生连边容量为s费用为0。 因为总人数要尽量大。那么每个学生必须参加一个小组。 那么每个学生向ed连边容量为s-1费用为0表示最多可以不选s-1个小组。 学生向每个小组连费用为负F[i]流量为1。 然后的建边是处理平方的经典: 其实多选了一个人你可以算下他们的平方差。 ...原创 2018-03-22 10:11:43 · 205 阅读 · 0 评论 -
bzoj3993: [SDOI2015]星际战争(二分+最大流)
题目传送门 。解法: 题目要求最短时间,那么二分答案咯。 然后用最大流来判断就好。st向每台激光连时间*Bi表示他的伤害。 然后其实我们并不需要知道他怎么安排攻击。 这个交给最大流来做。 我们需要求的是激光按照最优的分配能不能总伤害达到消灭全部装甲所需要的伤害。 那么每台装甲向ed连Ai表示消灭这个装甲只需要Ai点伤害。 注意精度代码实现:#include<...原创 2018-03-27 08:33:43 · 347 阅读 · 0 评论 -
bzoj1391: [Ceoi2008]order(最小割)
题目传送门 。解法: 裸的最小割吧。 st连任务流量为收益。 任务连机器流量为租金 机器连ed流量为花费。 这样的话一条路径的流量可以看作把某部分割掉。 跟最大获利同理。。 听说要用什么弧优化。。 去看hzwer博客?代码实现:#include<cstdio>#include<cstring>#include<cstdlib>...原创 2018-03-27 16:17:49 · 190 阅读 · 0 评论 -
bzoj3275: Number(最小割)
题目传送门 。解法: 最小割。 把不能在一起的点割去。 首先按照奇偶性把点分成两排。 同一排的点可以在一起选。首先偶数肯定可以同时选因为gcd>1 奇数也肯定可以同时选。 证明如下: x为奇数。 x%4等于1或3 x^2%4等于1。 两个奇数的平方和%4等于2。 而一个偶数的平方和%4等于0 那么证明两个奇数不能同时作为勾股数。 所以奇数肯定也可以同时选。...原创 2018-03-28 19:13:54 · 187 阅读 · 0 评论 -
bzoj3894: 文理分科(最小割)
题目传送门 跟上一题有点像呢。解法: 一个点不能同时选理科和文科。 那么这个割很容易建出来。 st连x容量为art x连ed容量为science 然后四周选相同的怎么表示割呢。 首先前面的最小割把全局割成了两个集合。 一个集合全部选理科。一个集合全部选文科。 那么在文科这个集合里就要连边。 那么对于每一个位置新建一个点。表示四周都选文科。 理科也是一样。新建一个点表示四周都选理原创 2017-12-28 13:06:48 · 380 阅读 · 0 评论 -
bzoj2132: 圈地计划(最小割)
题目传送门 网络流的题对于我这种蒟蒻来说真是玄学。 搞了一个晚上。。。。解法: 直接求最大利益不好做。 我们考虑将问题转化。。 将所有的利益加起来(显然不可能) 然后减去一些东西。。 那么我们怎么表示减去的东西呢。 将问题转化为(我是这么理解的): 首先根据题目一个点不能同时建两个区。 就是说只能建商业区或工业区。 然后若相邻的两个点建同样的区的话那么利益就损失了c[i][j]原创 2017-12-26 13:02:57 · 349 阅读 · 0 评论 -
bzoj2127: happiness(最小割)
题目传送门 。。解法: 跟文理分科有什么区别。 详情请见此blog代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<queue>using namespace std;struct node {in原创 2017-12-31 10:25:16 · 324 阅读 · 0 评论 -
有源汇有上下界最大流详解(loj116)
例题链接 首先吐槽一下放题人(我不知道是不是我理解错了什么。) 题目描述里就一个上下界然后就说要求最大流。。。 直接建上界然后跑最大流不就完了么?? 结果上网看了看题解发现还要满足可行流(题目描述是真的皮) 不知道是不是我理解的问题。没学过无源汇有上下界可行流的看这里 可行流我不刚学完么。。想了想。。 上一题是无源汇的,而这道题是有源汇的。 那么我只要将他变成循环流就可以了嘛(其实就原创 2017-09-14 20:05:21 · 2159 阅读 · 1 评论 -
无源汇有上下界可行流详解(loj115)
例题链接 先解释一下流量平衡。 每条边有出发点和结束点。 出发点就有流出的流量,结束点就有流入的流量。 流量平衡是所有节点流入流量等于流出流量。这种问题的思想就是: 在一个初始流的基础上加上一个附加流。 每条边的流量有上下界。那么初始每条边的流量就为每条边的下界。 用d数组表示每个点的流入量-流出量。那么: 附加流的流出量-流入量就应该等于初始流的流入量-流出量。 这样的话两个流的原创 2017-09-13 21:02:00 · 1794 阅读 · 2 评论 -
bzoj1001: [BeiJing2006]狼抓兔子(最大流)
题目传送门解法: 每一只兔子就需要一只狼。 那么我们只需要求出最多能通过多少只兔子即可。 然后就派多少只狼就行了呗。。 因为兔子从哪里过来的我就在哪里放狼。 所以狼的数量一定等于最多兔子通过的数量 题目并不要求求方案,所以不需知道兔子从哪过来。所以直接建边跑最大流就OK了。 注:因为是双向边所以反向边流量等于正向边流量。代码实现:#include<cstdio>#include<cs原创 2017-09-16 09:06:37 · 416 阅读 · 0 评论 -
bzoj1189: [HNOI2007]紧急疏散evacuate(二分+最大流+宽搜)
题目传送门 这道题真的是一道好题啊!!!! 表示做了两个小时。。 bzoj的数据是真的强(pi)。一开始yy了个图结果发现错了。 上网看了看题解。按照构图敲了个代码。 错了!!! 听说被一组神数据卡掉了。 数据如下。 4 5 XXDXX XX.XX X…X XXDXX 按照题解的方法跑出来答案是2但是手算是3。 很无语,只好自己yy了。。 所以想到了拆点。建图是这样的:原创 2017-09-16 14:32:01 · 524 阅读 · 0 评论 -
bzoj1070: [SCOI2007]修车(最小费用最大流)
题目传送门 继续膜一发费用流。 考构图的神题。 然而我审错题了读入的时候m,n读反了,WA了半天美滋滋。。解法: 一个技术员可能修多辆车。 那么他每修一辆车只能对后面需要修的车产生影响。 然而我们并不知道某技术员修多少辆车。 所以我们采用倒数。 那么这个技术员倒数修的车是谁就会对后面的车都有影响(包括自己) 那么就差点咯。 一个技术员最多修n辆车。所以每个技术员拆成n个点。 第原创 2017-10-07 10:25:16 · 278 阅读 · 0 评论 -
bzoj1711: [Usaco2007 Open]Dining吃饭(网络流)
题目传送门 真是吃屎了漏了一个细节。解法: 想了一会儿怎么表示一头牛又吃了饮料又喝了食物呢。 很简单。牛放在中间不就完了。 左边食物右边饮料,流量都为1。 食物连向牛,牛连向饮料,这样就能表示啦。 哈哈又切一题。开心的码代码。 错了! 想了半天发现一头牛可能吃了两份东西。。那样的话流量就会为2了。。 流量为2肯定有两个食物各给了流量。 那么我们就需要限制每头牛只吃一个食物,所以每原创 2017-10-18 09:18:30 · 366 阅读 · 0 评论 -
bzoj1061: [Noi2008]志愿者招募(最小费用最大流)
题目传送门 这题真是神。 让我学了一种很神的建模方式。。 突然感觉以前的费用流好辣鸡啊。 好神。。解法: 扣一发题解: 膜拜dalao真的强。代码实现://弱弱的膜题解#include<cstdio>#include<iostream>#include<cstdlib>#include<algorithm>#include<cstring>using namespace st原创 2017-10-06 15:54:27 · 381 阅读 · 0 评论 -
bzoj1066: [SCOI2007]蜥蜴(网络流)
题目传送门 这道题怎么跟我以前做的题那么像。 求没通过的蜥蜴最小不就是求通过的最大吗。 最大流走起。解法: 就因为有点像所以我一开始就想错了。。 以前的题是时间,我一般都是用拆点的。 但是。。 这道题是一个人经过这个点这个点寿命就-1。 按照寿命拆点的话就无法限制通过人数了。 所以每个点要拆成两个点。 两个点之间连边,流量为这个点的寿命(也就是能有多少个人在这上面踩) 这样的话原创 2017-10-22 15:10:04 · 293 阅读 · 0 评论 -
bzoj1877: [SDOI2009]晨跑(费用流)
题目传送门 这道题不错啊。解法: 既然每个点只能走一次,那么拆点就很容易想到了。 Ax表示x拆成的第一个点。 Bx表示x拆成的第二个点。 我们把每个点拆成A和B。 从A到B有一条流量为1费用为0的边,表示这个点只能走过一次。 一条边x,y。 从Bx向Ay连一条费用为长度,流量为1的边。 因为这条边肯定也只能走一次啦。然后就跑最小费用最大流啊。 然后我就错了? 为什么。 因为第原创 2017-10-25 11:24:52 · 311 阅读 · 0 评论 -
bzoj1497: [NOI2006]最大获利(网络流)
题目传送门 真的皮。解法: 这道题不会啊。 %了题解都说是最大权闭合子图。 最大权闭合子图的方法。 st向正权点(可以赚钱的)连容量为利益的边。 负权点(要花钱的)向ed连容量为花的钱的边。 图中的边(对应的利益和花费)连容量为无限大的边。 答案为总利益-最大流为什么? 花了好久来想: 如果一条路径上面流过的流量是等于他的花费的。 说明他的利益是大于花费的,那么赚钱肯定要选。原创 2017-10-25 16:21:20 · 516 阅读 · 0 评论 -
bzoj1221: [HNOI2001] 软件开发(费用流)
题目传送门 费用流真的强。解法: 一眼看过去感觉像费用流。 有数量有花费。。 想了一会儿,每天都有用完都会有剩下的,那我把他拆成两个点呗。 一个点表示当前剩下的(A),一个点连ed表示用过的(B)。 每天一开始剩下的就相当于需要的。 所以st连Ai连一条容量为ni费用为0边,表示每天都给ni条毛巾,暂时我还不知道怎么分配的(是买还是用之前的) 如果你想全部直接买的话(也有这种可能)原创 2017-10-26 09:18:19 · 413 阅读 · 0 评论 -
bzoj1834: [ZJOI2010]network 网络扩容(最小费用最大流)
题目传送门 哇神题。。解法: 好像又加深了对费用流的理解。 看到这道题就是各种不会啊。 第一问很好做跑裸的最大流就可以。 第二问的话。 实际上就是在第一问的残量网络上加流量使得最大流为K。 那每条边最大的流量就为K咯。然后费用就为话费咯。 跑一遍最小费用最大流就行啦。代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#原创 2017-11-20 12:42:24 · 358 阅读 · 0 评论 -
bzoj1412: [ZJOI2009]狼和羊的故事(最小割)
题目传送门 百题纪念。。解法: 娃真的强呀。 听说是最小割模型。 %了一下建图方法。把图建了出来。 st连狼容量为无限大。 羊连ed容量为无限大。 狼向四周的羊和空地连容量为1的边。 空地向四周的空地和羊连容量为1的边。 想了很久为什么跑出来最大流就是答案。 其实这样跑出来的答案就是所有的狼去吃到羊有多少种路径呀。 相对于每一个栅栏,如果我们不修的话那么肯定有一种方法可以使得狼原创 2017-11-29 13:15:34 · 313 阅读 · 0 评论 -
bzoj4873: [Shoi2017]寿司餐厅(网络流)
题目传送门 神题啊。解法: 最大权闭合子图。 不是很会用所以花了一整天的时间来想怎么构图。 然后之前做过最大获利这道题(bzoj1497) 那道题好像更水一点。 从那道题受到了一点点启发。 那么很显然要把每个区间都看成点啊。 那么按照最大权闭合子图st连正权点,负权连ed。 每个区间因为包含关系: d[i][j]包含d[i+1][j],d[i][j-1]。 所以要向这两个区间连原创 2017-12-01 13:50:38 · 362 阅读 · 0 评论 -
bzoj3280: 小R的烦恼(费用流)
题目传送门 。解法: 一开始yy了个建图。 完全没毛病。 结果不知道怎么判impossible了。。 很尴尬。每天分成两个点。 一个点x表示今天收到多少个活人。。 一个点y表示多少个濒死的人。今天雇的人一定会用。所以变成死人。大学连y,容量无限费用q[i] 每天最多a[i]个死人。st连y容量a[i]费用0 每天最多a[i]个活人。x连ed容量a[i]费用0 死人救...原创 2018-04-12 13:30:24 · 364 阅读 · 0 评论