网络流与线性规划 24 题
(其中 P2775 机器人路径规划问题 为错题,因此实际只做 \(23\) 题)
P2756 飞行员配对方案问题
二分图匹配模板题
P4016 负载平衡问题
令 \(a'_i=a_i-\overline{a}\),建立 \(n\) 个节点,相邻(环上相邻)两个之间连容量为 \(\infty\),费用为 \(1\) 的边,对于每个 \(i\) 若 \(a_i>0\) 则源点向 \(i\) 连容量为 \(a_i\) 费用为 \(0\) 的边,否则 \(i\) 向汇点连容量为 \(-a_i\) 费用为 \(0\) 的边,跑费用流
由于是最大流,保证了 \(a_i\) 大于 \(0\) 的部分都流走了(否则起点出发的边没有满流),\(a_i\) 小于 \(0\) 的部分都补足了(否则到达终点的边没有满流)
最终一条 \(S-a_x-a_y-\cdots-a_z-T\) 的流的意义为将 \(1\) 个物品由 \(a_x\) 移到 \(a_z\)
最小费流用保证了总代价最小
时间复杂度 \(O(n^2f)\),一般可以解决 \(n\le100\) 范围内的问题
个人认为数学方法时间复杂度、思维难度、代码长度、代码实现难度等各方面都远远优于费用流方法
P2765 魔术球问题
每个数建一个节点(既然需要输出方案,且数据范围很小,有理由猜测最终答案一定不会太大,应该不超过 \(10^4\sim 10^5\) 范围,实际上 \(n=55\) 时最多能放 \(1567\) 个球,建图完全可以接受)
若 \(i<j\) 且 \(i+j\) 为完全平方数,则节点 \(i\) 向节点 \(j\) 连有向边
则问题转化为在这张无穷大(实际上代码中关心的部分大小有限)图上选择不超过 \(n\) 条链,使得 \(1\sim R\) 号节点全都被覆盖,要求 \(R\) 尽可能大
一种实现是二分答案,转化为求图的最小链覆盖数,时间复杂度 \(O(N^{7/4}\log N)\),其中 \(N\) 为答案,二分图部分用匈牙利算法应该也可以过
另一种是从 \(1\) 开始枚举答案,每个点拆为入点和出点,每次将图中增加的部分连上(源点向入点,出点向终点,可与之匹配的入点向其出点),在前一次的残量网络上继续跑最大流,若不能流了,则新开一根柱子,若柱子数超过 \(n\) 则跳出,时间复杂度应该为 \(O(N\sqrt N\min((N\sqrt N)^\frac12,N^\frac23))=O(N^{\frac{13}6})\)
本题也有贪心解法,但个人认为比较依赖打表,且具体证明比较难,与网络流解法的时间复杂度的差距也不是特别大,两者各有优劣
P4011 孤岛营救问题
目前没有想到也没有找到网络流解法,不知道为什么在 \(24\) 题里
可以状压加 \(bfs\) 做,时间复杂度 \(O(nm2^p)\),需要注意题目描述中一些细节
P2761 软件补丁问题
同样没找到网络流解法
使用 \(bfs\) 可以做到 \(O(n2^n+m2^n)\),注意不要显示建图,否则空间不足
P4014 分配问题
\(n\) 个人各自建一个点,\(n\) 个工作各建一个点,两部分之间连 \(n\times n\) 条边,则转化为二分图最小权完美匹配、最大权完美匹配,可以 \(KM\) 算法(时间复杂度 \(O(n^3)\))或费用流(时间复杂度 \(O(NMF)=O(n\times n^2\times n)=O(n^4)\))解
P4015 运输问题
每个仓库建一个点,每个零售商店建一个点,跑费用流即可,时间复杂度 \(O((n+m)nmf)\)
P3254 圆桌问题
每张桌建一个点,每个单位建一个点,源点向每张桌对应点连边,容量为这张桌最大人数,每个单位对应点向汇点连边,容量为人数,左部点和右部点之间两两连边,表示左部点对应桌子有一个右部点对应单位的人,然后二分图多重匹配即可,时间复杂度 \(O((n+m)\sqrt{nm})\)
P2763 试题库问题
每种题建一个点,每道题建一个点,连边后跑二分图多重匹配即可,时间复杂度 \(O((n+m)\sqrt{nm})\)
P3355 骑士共存问题
黑白染色,每个无障碍的位置建一个点,黑的作为左部点,白的作为右部点,可互相直接到达的点对连边,转化为二分图最大独立集,直接计算即可,时间复杂度 \(O(n^4)\)
P3358 最长k可重区间集问题
考虑将每个点覆盖次数不超过 \(k\) 转化为在数轴上从 \(1\) 到 \(\infty\) 扫描,若遇到选择的左端点则计数器加一,若遇到选择的右端点则减一(同时遇到优先后者),全程保持计数器的值不超过 \(k\)
对于数轴上每个整点建一个点,源点向第一个点连边,最后一个点向汇点连边,两者费用为 \(0\),容量为 \(k\)
数轴上每个点向下一个点连容量 \(k\) 费用 \(0\) 的边,原图的每个区间 \((l,r)\) 令 \(l\) 向 \(r\) 连容量 \(1\) 费用 \(r-l\) 的边
在图上跑最大费用最大流即可
需要离散化坐标
时间复杂度 \(O(NMF)=O(n^2k)\)
P2774 方格取数问题
先全部选上,然后去掉尽量少的使之合法
转化为选出权值总和最小的一个子集,满足去掉这个子集后两两不相邻
黑白染色,每个格子建立一个点,点和源汇之间的边容量为格子上的数,点向与其相邻的点连容量正无穷的边,求最小割即可
时间复杂度 \(O(nm\sqrt{nm})\)
P4009 汽车加油行驶问题
分层图最短路时间复杂度为 \(O(n^2k\log (n^2k))\)(\(dijkstra\))或 \(O(tn^2k)\)(\(SPFA\),其中 \(t\) 为 \(SPFA\) 的小常数)
也有 网络流的解法,但本质上是在 \(SPFA\) 外硬套了一个费用流,只会 \(bfs\) \(O(1)\) 次,即进行了 \(O(1)\) 次 \(SPFA\),因此时间复杂度同上,个人感觉这题不适合用网络流
P2754 [CTSC1999] 家园 / 星际转移问题
先用并查集判定是否存在答案,然后每一时刻的每个星球建一个点,枚举答案,每次加入 \(n+2\) 个点并连边,在上一次的基础上继续跑最大流并累计流量,若第一次流量 \(\ge k\) 则当前枚举的时间就是答案,时间复杂度 \(O((nT)^2{(n+m)T})\),其中 \(T\) 为答案,由于 \(T\le knm\),因此时间复杂度上限为 \(O(n^5m^3k^3(n+m))\),但完全跑不满
P2762 太空飞行计划问题
原问题等价于所有实验的收益总和减去最终未选择的实验和最终选择的仪器的总价格
建立 \(n+m\) 点的二分图,左部 \(m\) 点分别代表每个实验,右部 \(n\) 点分别代表每个仪器,实验向所需仪器连边,左部点点权为实验收益,右部点点权为仪器代价
前者容易计算,后者等价于在建出的图中删去权值总和最小(因为总收益最大,因此失去的收益最小)的一部分点,满足剩余左部点(即剩下的实验)能到达的所有右部点都没有删去
其值等于总点权减去图的最大权闭合子图大小,可网络流求出
总时间复杂度 \(O((n+m)\sqrt{nm})\)
P2770 航空路线问题
即找到两条从 \(1\) 到 \(n\) 的路线,满足除了起点和终点外点集不交,最大化经过的总点数
对于每个城市 \(i\),建立入点 \(in(i)\) 和出点 \(out(i)\),每个 \(in(i)\) 向对应的 \(out(i)\) 连费用 \(1\) 的边,若 \(i=1\) 或 \(i=n\) 则容量为 \(2\),否则容量为 \(1\),这条边限制每个城市经过的次数
源点向 \(in(1)\) 连容量 \(2\) 费用 \(0\) 的边,限制路径数
\(out(n)\) 向汇点连容量 \(2\) 费用 \(0\) 的边,累加流量和费用
对于原图的每条边 \(u\rightarrow v\)(满足 \(u<v\)),\(out(u)\) 向 \(in(v)\) 连容量 \(\infty\)(可以为任意 \(\ge 2\) 的数,但若容量设为 \(1\) 则对于 \(1\rightarrow n\) 的情况无法处理,\(WA\) 第 \(2\) 个点)费用 \(0\) 的边
则答案为图的最大费用最大流
时间复杂度 \(O(NMF)=O(n\times m\times 2)=O(nm)\)
P4012 深海机器人问题
类似 P2045 方格取数加强版,但点权变为边权
每个格点建立一个点,若 \((i,j)\) 到 \((i+1,j)\) 的边权为 \(v\),则 \((i,j)\) 对应点向 \((i+1,j)\) 连容量 \(1\) 边权 \(v\) 的边和容量 \(\infty\) 边权 \(0\) 的边,表示第一次经过可以有 \(v\) 的收益,之后每次都没有收益;\((i,j)\) 到 \((i,j+1)\) 同理
对于 \(a\) 个起点 \((v_i,x,y)\),建立一个超级源点,分别向 \((x,y)\) 连容量 \(v\) 费用 \(0\) 的边;汇点同理
跑最大费用最大流即可
时间复杂度 \(O(NMF)=O(p^2q^2V)\)(其中 \(V\) 为总机器人数量)
P2766 最长不下降子序列问题
第一问直接 \(dp\) 即可,设 \(f_i\) 为 \(a_{1\sim i}\) 以 \(i\) 结尾的最长不下降子序列长度,令 \(s\) 为第一问答案
后两问考虑建图
对每个下标建入点和出点,两者之间连边
对于每一组满足 \(u<v,a_u\le a_v,f_v=f_u+1\) 的 \((u,v)\),\(u\) 的出点向 \(v\) 的入点连边
源点向所有 \(f_u=1\) 的 \(u\) 的入点连边,所有 \(f_u=s\) 的 \(u\) 的出点向汇点连边
以上边容量都是 \(1\)
则这张图的最大流即为第二问的答案
对于第三问,在第二问的基础上(即重置边,或累加上第二问的最大流),源点向 \(1\) 的入点、\(1\) 的入点向 \(1\) 的出点、\(n\) 的入点向 \(n\) 的出点、\(n\) 的出点向汇点连容量 \(\infty\) 的边,其中 \(f_n=s\) 时才连后两条边,则这张图的最大流为第三问的答案
总时间复杂度 \(O(n^4)\),但完全跑不满
P3357 最长k可重线段集问题
若将线段 \((x_0,y_0,x_1,y_1)\) 看做权值为 \(\left\lfloor\sqrt{(x_1-x_0)^2+(y_1-y_0)^2}\right\rfloor\) 的区间 \((x_0,x_1)\),则做法和 P3358 最长k可重区间集问题 相同,但是当 \(x_0=x_1\) 时,线段退化为点,此时为区间 \([x_0,x_1]\),不是开区间
将坐标范围扩大两倍,则开区间 \((l,r)\) 变为开区间 \((2l,2r-1)\),闭区间 \((x,x)\) 变为开区间 \((2x-1,2x)\),然后就可以套用 P3358 的做法了
时间复杂度相同
P4013 数字梯形问题
三者都可以转化为点至多经过 \(x\) 次,边至多 \(y\) 次的形式
建图时,每个格子 \((i,j)\) 拆为入点和出点,两者之间连容量 \(x\) 费用 \(a_{i,j}\) 的边,以限制点上的流量
每个格子的出点向左下和右下格子的入点连容量 \(y\) 费用 \(0\) 的边,以限制边上流量
源点向每个第一行的点连容量 \(1\) 费用 \(0\) 的边,以限制第一行的路径
最后一行每个点向汇点连容量 \(\infty\) 费用 \(0\) 的边
跑最大费用最大流即可
时间复杂度 \(O(NMF)=O(n^2m^2f)\)
P1251 餐巾计划问题
将每天拆为两个点,分别表示当天早上(\(mor(i)\))和当天晚上(\(eve(i)\))
源点向 \(eve(i)\) 连容量 \(r_i\) 费用 \(0\) 的边,表示当天新产生 \(r_i\) 条用过的餐巾
\(mor(i)\) 向汇点连容量 \(r_i\) 费用 \(0\) 的边,表示当天需要提供 \(r_i\) 条干净的餐巾
\(eve(i)\) 向 \(eve(i+1)\) 连容量 \(\infty\) 费用 \(0\) 的边,表示将脏餐巾留到下一天
源点向 \(mor(i)\) 连容量 \(\infty\) 费用 \(p\) 的边,表示买新餐巾
\(eve(i)\) 向 \(mor(i+m)\) 连容量 \(\infty\) 费用 \(f\) 的边,表示送去快洗
\(eve(i)\) 向 \(mor(i+n)\) 连容量 \(\infty\) 费用 \(s\) 的边,表示送去慢洗
跑最小费用最大流即可,时间复杂度 \(O(N^2\sum r_i)\)
P3356 火星探险问题
每个位置建入点和出点,若有岩石则入点向出点连容量 \(1\) 费用 \(1\) 的边和容量 \(\infty\) 费用 \(0\) 的边,否则只连后者,每个位置的出点向其下方和右侧的入点连容量 \(\infty\),费用 \(0\) 的边,源点向左上角的入点连容量 \(k\) 费用 \(0\) 的边,右下角的出点向汇点连容量 \(k\) 费用 \(0\) 的边,则答案为最大费用最大流,时间复杂度 \(O(NMF)=O(p^2q^2k)\)
P2764 最小路径覆盖问题
初始每个点为一条路径,共 \(n\) 条不交路径,考虑使用网络流将路径尽量合并起来
每个点 \(i\) 拆为左部点 \(lf(i)\) 和右部点 \(rt(i)\),源点向所有左部点连边,所有右部点向汇点连边,对于原图的 \(u\to v\),在二分图上连 \(lf(u)\to rt(v)\),容量都是 \(1\)
求二分图最大匹配,若 \(lf(x)\) 和 \(rt(y)\) 匹配,则相当于在原图上用边 \(x\to y\) 连接以 \(x\) 结尾的路径和以 \(y\) 开始的路径以得到更长的路径
由于每个左部点至多匹配一个右部点,每个右部点至多匹配一个左部点,因此保证选择的边使每个点至多有一个后继点、每个点至多一个前驱点,即保证的选出的是不交路径
输出方案时直接沿选择的匹配边走下去即可
时间复杂度 \(O(n\sqrt m)\)

浙公网安备 33010602011771号