网络流 24 题
网络流 24 题
1. 餐巾计划问题
将每天拆成两个点,\(i_1\) 点用于接收干净毛巾,\(i_2\) 点用于接收脏毛巾。那么:
- 从 \(i_1\) 向 \(T\) 连流量为 \(r_i\),费用为 \(0\) 的边,如果满流则表示当天的干净毛巾数量足够。
- 从 \(S\) 向 \(i_2\) 连流量为 \(r_i\),费用为 \(0\) 的边,表示每天结束时接收到 \(r_i\) 条脏毛巾。
- 从 \(S\) 向 \(i_1\) 连流量为 \(\infty\),费用为 \(p\) 的边,表示每天开始时购买毛巾。
- 从 \(i_2\) 向 \((i+m)_1\) 连流量为 \(\infty\),费用为 \(f\) 的边,表示送到快洗。
- 从 \(i_2\) 向 \((i+n)_1\) 连流量为 \(\infty\),费用为 \(s\) 的边,表示送到慢洗。
- 从 \(i_2\) 向 \((i+1)_2\) 连流量为 \(\infty\),费用为 \(0\) 的边,表示将脏毛巾留到下一天。
跑最小费用最大流即可。
2. 星际转移问题
Luogu P2754 [CTSC1999]家园 / 星际转移问题
按照时间拆点,将每个点按照编号和时间拆成若干个点 \((i,t)\)。然后直接按照题目给出的太空船停靠的位置进行连边,然后 \((i,t)\) 向 \((i+1,t)\) 连边,只有 \((-1,t)\) 向 \((-1,t-1)\) 连边。\(S\) 向 \((0,0)\) 连边,\((-1,0)\) 向 \(T\) 连边。从小到大枚举答案跑最大流即可。
注意每次跑最大流的时候都是在上一次跑完的残量网络上跑,因此最大流的答案需要累加。
3. 飞行员配对方案问题
二分图最大匹配板子,直接跑最大流即可得出最大匹配数。
考虑方案,显然在残量网络中,匹配上的一对之间的连边的流量变成了 \(0\)。因此可以枚举残量网络中所有的边,判断这条边的流量是否为 \(0\) 来得出方案。
4. 软件补丁问题
(口胡解法)直接跑状压。
5. 太空飞行计划问题
(因为输入格式太恶心了所以就口胡了)将实验与仪器的依赖关系建成二分图,流量为 \(\infty\);从 \(S\) 向实验连实验的报酬为流量的边;从仪器向 \(T\) 连仪器费用为流量的边。然后跑最小割即可。
方案就扫一下所有边,看那些边的流量为 \(0\) 就说明这条边被割掉了,其他流量不为 \(0\) 的就表示保留了实验或者仪器。
6. 试题库问题
建二分图然后直接跑最大流即可,方案判断是否流量为 \(0\)。
7. 最小路径覆盖问题
对于一个路径,显然路径上的每一个除了终点的点的出度均为 \(1\)。因此考虑将所有点拆点成两个点 \(i_1,i_2\)。那么对于一条边 \(u\to v\),可以转换成为 \(u_1\to v_2\),由于 \(i_1\) 最多匹配一个 \(j_2\),因此这就被转化成为了一个二分图匹配问题,套板子即可。
对于输出方案,可以用并查集判断每条路径上的点,然后看哪一个点没有入度就将这个点作为路径起点输出即可。
8. 魔术球问题
从小到大枚举答案。假设 \(i+j=k^2(k\in \mathbb N^*)\),那么从 \(i\) 向 \(j\) 连边,最终一定会形成一个 DAG。然后就转化成为了最小路径覆盖问题,用那道题的做法即可解决。考虑什么时候找到答案,显然是当点数 \(\text{num}\) 减去最大流 \(\text{ans}\) 大于了 \(n\) 的时候为答案,即 \(\text{num}-\text{ans}>n\)。
枚举答案的时候,注意每次都在上一轮的残量网络上跑最大流,因此答案需要累加。
9. 最长不下降子序列问题
第一个问题直接 DP 即可。
第二个问题和第三个问题基本相同。
将每个下标按照 \(f_i\) 值分层,\(f_i\) 层的点只能和 \(f_i-1\) 层的点相连。那么从 \(S\) 向 \(f_i=1\) 的 \(i\) 连流量为 \(1\) 的边,然后对于 \(f_i=t\) 的 \(i\),从 \(j<i,a_j\le a_i,f_j=t-1\) 的 \(j\) 连一条流量为 \(1\) 的边。对于 \(f_i=\max\limits_{1\le j\le n} f_j\) 的 \(i\),向 \(T\) 连一条流量为 \(1\) 的边,然后跑最大流就解决了问题二。
对于问题三,可以将 \(S\) 向 \(i=1\) 连的边的流量改为 \(\infty\),\(i=n\) 向 \(T\) 连的边(如果存在)的流量改成 \(\infty\),然后再跑一次最大流即可。
10. 航空路线问题
将回路拆成两条从 \(1\) 到 \(n\) 的路,然后直接跑最大流即可。
如果出现只能到达 \(1,n\) 两个点的情况需要特判一下。
11. 方格取数问题
将格子按照棋盘的方式进行黑白染色,相邻格子连边形成二分图,然后跑最小割。
12. 机器人路径规划问题
错题,不做。
13. 圆桌问题
直接建二分图跑二分图匹配即可。
14. 骑士共存问题
与方格取数问题相同,按照棋盘方式黑白染色,然后将两个骑士能攻击到的位置连边,跑最小割。
15. 火星探险问题
源点向机器人的起点连边,机器人的终点向汇点连边,对于每一个石头都拆点成入点和出点,入点和出点之间先连一条流量为 \(1\),费用为 \(1\) 的边,然后再连一条流量为 \(\infty\),费用为 \(0\) 的边。然后跑最大费用最大流。
对于方案,还是通过看残量网络中那些边被流过多少流量进行判断是否被经过以及被经过多少次。
16. 最长 k 可重区间集问题
区间的端点作为特殊点。相邻两个特殊点之间连一条流量为 \(\infty\),费用为 \(0\) 的边,然后对于一个区间,从左端点向右端点连一条流量为 \(1\),费用为区间长度的边。源点向最靠左侧的特殊点连一条流量为 \(k\),费用为 \(0\) 的边。然后跑最大费用最大流即可。
17. 最长 k 可重线段集问题
与最长 k 可重区间集的建模方式基本一致。不过因为可能出现线段的左右端点的 \(x\) 坐标一样,因此需要将每一个特殊点拆点。如果线段左右端点不一样,那么就从左端点的出点连向右端点的入点;否则,从左端点的入点连向左端点的出点。然后将费用更改为线段的长度,跑最大费用最大流。
18. 汽车加油行驶问题
(口胡)将图按照剩余油量分层,然后就很板了。
19. 孤岛营救问题
令 \(f_{i,j,s}\) 表示当前位置在 \((i,j)\),并且拿到钥匙的状态是 \(s\) 的最短时间,用广搜来转移即可。
20. 深海机器人问题
与火星探险问题完全一致。
21. 数字梯形问题
每个点拆点成为入点和出点。从源点向梯形最顶层的 \(m\) 个点连流量为 \(1\),费用为 \(0\) 的边。
- 对于第一个问题,每个点的入点向出点连流量为 \(1\),费用为点权的边。向左下和右下的点的入点连流量为 \(1\),费用为 \(0\) 的边。
- 对于第二个问题,每个点的入点向出点连流量为 \(\infty\),费用为点权的边。向左下和右下的点的入点连流量为 \(1\),费用为 \(0\) 的边。
- 对于第三个问题,每个点的入点向出点连流量为 \(\infty\),费用为点权的边。向左下和右下的点的入点连流量为 \(\infty\),费用为 \(0\) 的边。
跑最大费用最大流即可。
22. 分配问题
直接建立二分图跑二分图最大带权匹配即可。
23. 运输问题
与分配问题一样,跑二分图最大带权匹配。分别用最小费用最大流和最大费用最大流各跑一遍即可。
24. 负载平衡问题
可以计算出最终状态下每个仓库存储的货物数量,如果一个仓库存多了,那么就从源点向该仓库连流量为 \(\Delta a\),费用为 \(0\) 的边;如果少了那么就从该仓库向汇点连流量为 \(\Delta a\),费用为 \(0\) 的边;相邻两个仓库之间连流量为 \(\infty\),费用为 \(1\) 的双向边,然后跑最小费用最大流即可。