2018 BUPT Summer Training 网络流 by 月加 题集总结

本文解析了网络流算法在解决多种问题中的应用,包括割点、割边、资源分配、工程问题、开除员工收益、隔离点收益、志愿者招募等经典场景,通过实例详细阐述了解题思路和建图方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A - Drainage Ditches POJ - 1273 简单模板题
B - Friendship POJ - 1815
大致题意:时限2秒,给出200个点,5000 条边的无向图,以及S和T,问将S和T分割开来最少需要删去多少个点,以及最小字典序的割点集合

建图方法:每个点分割成入点和出点,之间连容量为1的边;对于原来的图中的连边,则从起点的出点 向 终点的入边建立一条容量为极大值的边。

直接建立图,求最小字典序的割边的集合时,按顺序依次将每条边从图中暂时拿去,重新建图再跑最大流,如果此时的最大流比前一次的最大流小的话,则该条边是割边,并将其从图中永久删去。直到最大流为0的时候停止寻找割边。

C - Reactor Cooling ZOJ - 2314 上下界网络流裸题

D - Number HYSBZ - 3275
题意:
有N(n<=3000)个正整数,需要从中选出一些数,使这些数的和最大。若两个数a,b同时满足以下条件,则a,b不能同时被选
1:存在正整数C,使aa+bb=c*c
2:gcd(a,b)=1

解法:如果两个数互质,则这两个必定一个为奇,一个为偶,则可以将数分为两类,源向代表奇数的点连一条容量为该点的数值的边,代表偶数的点向汇连一条容量为该点的数值的边。如果某两个数满足题目给出的条件,则在这两个数对应的点之间建立一条容量为极大值的边。于是,如果存在从S到T的流量就意味着存在一对满足关系的点。最后求出最小割,就是意味着把所有满足关系的点对的其中一个去掉的最小代价。再用所有的数值之和减去最小代价就是该题的答案。

E - 软件开发 HYSBZ - 1221
大致题意:有n天,每天需要 a [ i ] a[i] a[i]块消毒毛巾,有3种消毒毛巾的获取方法:

  1. 直接购买新的消毒毛巾,每块消毒毛巾费用为f
  2. 把这一天有的毛巾进行消毒,经过a天,每块消毒毛巾费用为fa
  3. 把这一天有的毛巾进行消毒,经过b天,每块消毒毛巾费用为fb
    问经过n天以后最小总费用为多少。

解法:将每个点分成A点和B点,所有的A点向汇点连一条容量为 a [ i ] a[i] a[i],费用为0的边;从源点向每个A点连一条容量为极大值,费用为 f f f的边;从源点向每个B点连一条容量为 a [ i ] a[i] a[i],费用为 0 0 0的边;所有的 B [ i ] B[i] B[i]点向 A [ i + a + 1 ] A[i+a+1] A[i+a+1]点连一条容量为极大值,费用为 f a fa fa的边;所有的 B [ i ] B[i] B[i]点向 A [ i + b + 1 ] A[i+b+1] A[i+b+1]点连一条容量为极大值,费用为 f b fb fb的边;所有的 B [ i ] B[i] B[i]点向 B [ i + 1 ] B[i+1] B[i+1]点连一条容量为极大值,费用为 0 0 0的边。

F - 修车 HYSBZ - 1070
经典的工程问题

解法:把每个代表工人的点拆成n个点,分别代表第1,2,3…n次修理,每辆车向这些点连容量为1,费用为 g [ i ] [ j ] ∗ k g[i][j]*k g[i][j]k,表示第 i i i个工人倒数第 k k k次修理的车辆为第 j j j辆给总等待时间带来的增量。然后从源点向所有代表车辆的点连容量为1,费用为0 的边,所有代表工人的点向汇点连容量为1,费用为0 的边。

G - Firing POJ - 2987
大致题意:开除每个员工会带来对应的收益或者损失,开除一个员工同时也会开除其所有的下属,下属的下属…给出开除员工的收益或损失,以及上司和下属关系(一个员工可能会有多个上司),问开除员工的最大收益是多少,获得最大收益时最少需要开除多少员工。

解法:从源点向所有开除后获得收益的员工连一条容量为收益量的边;所有开除后导致损失的员工向汇点连一条容量为损失量的边;对于所有的下属关系建立一条从上司到下属,容量为极大值的边。则答案为收益的总和减去最大流。其中开除的员工即为,去掉所有的满流边以后,和S相连的点。

理解:假设只有一个员工会带来收益,则如果从该点到汇点的最小割大于其收益,也就是源点到该点的边满流了,表示开除该员工带来的总利润为非正数,为答案带来的总利润为收益值减去最小割,也就是0;
相对应的,如果源点到该点没有满流,表示开除该员工带来的总利润为正值,为答案带来的总利润值为收益值减去最小割。
对于一个可以带来收益的员工的集合也是一样的。

H - Being a Hero HDU - 3251
给出一个图(n<=1e3,m<=1e5),每条边都带有边权,有些点有收益值,问删去某些边以后,和1号点相隔离的点的收益之和减去删去的边的边权之和最大为多少,以及删去哪些边。

解法:定1号点为源点,从所有的收益点向汇点连容量为收益值的边,其他点之间的连边的容量为该边的边权。答案是所有的收益点的收益之和减去最大流,删去的边为那些,跑完最大流以后的残量网络中,从1号点可达的点到1号点到不可达的点的满流边。

理解:先考虑只有一个收益点的情况下,则如果从1号点到该收益点的最小割大于其收益,即将这个收益点和1号点隔开的总利润为负数,否则利润为正数。再考虑对于一个收益点的集合,也是一样的。

I - 志愿者招募 HYSBZ - 1061
大致题意:
给定长度为n的目标序列A,和m种操作,每种操作可以使用无限次,每次操作可以将序列 L [ i ] L[i] L[i] R [ i ] R[i] R[i]的值加1,费用为 C [ i ] C[i] C[i]。初始序列B长度为n,值全为0。问序列B进行操作后,直到对于所有 1 ≤ i ≤ n {1 \le i \le n} 1in都满足 B [ i ] ≥ A [ i ] B[i] \ge A[i] B[i]A[i]所需的最小代价和。

解法:先把序列A做一次差分,对于每个差分后的 A [ i ] A[i] A[i],如果为负数,则从源点向 i i i点连一条容量为 ∣ A [ i ] ∣ |A[i]| A[i],费用为0的边;如果为正数,则从 i i i点向汇点连一条容量为 A [ i ] A[i] A[i],费用为0的边。从每个 r [ i ] + 1 r[i]+1 r[i]+1点向 l [ i ] l[i] l[i]点连一条容量为极大值,费用为 C [ i ] C[i] C[i]的边。最后从点 i i i向点 i + 1 i+1 i+1连一条容量为极大值,费用为0的边。

理解:到每个节点的流量可以理解为当前点的差分值。而题目要求为每个当前差分值都不少于序列A的差分序列B对应的 B [ i ] B[i] B[i]。对于每个 B [ i ] B[i] B[i],如果为正数,则从对应的点向汇点连容量为 B [ i ] B[i] B[i],费用为0的边,表示限制该点的当前差分值不应该少于 B [ i ] B[i] B[i],否则从源点向该点连容量为 − B [ i ] -B[i] B[i],费用为0的边,表示从该点以后的当前差分值都可以相对地提高 − B [ i ] -B[i] B[i],这个稍微想一下就可以知道为什么了。而操作则对应的转化为了从后向前连的边,表示将右端点的当前差分值降低,左端点的当前差分值提升,在原序列上就表现为区间加法。
注意在建图的时候需要将差分得到的第n+1个点也要考虑进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值