网络瘤乱做

待整理题目:

  1. CF1404E Bricks
  2. P4452 [国家集训队]航班安排

还未完成的题

网络流二十四题

  1. 餐巾计划问题

  2. [CTSC1999] 家园/星际转移问题

如果地球和月球间不连通则无解,否则必定有解,这个可以通过并查集判断。二分答案,转化为可行性判断。考虑最大流,对于每个时刻建分层图:人可以选择一条航线坐飞船前往下一个星球,对于每只航线飞船当前在哪一星球,会飞往哪一星球都可以简单计算得到,对应连边,容量为飞船最大载客量;人亦可以选择停留在当前星球,因此从上一个时刻每个星球向这个时刻的同一星球连 INF 的边。建立超级源汇,源点连向所有地球对应的点,所有月球对应的点都连向汇点,容量均为 INF。如果整张图的流量超过了 \(k\) 则证明当前时刻有解了。注意到答案并不大,重新建图时间开支很大,所以实际实现上可以直接从小到大枚举答案,在原图基础上加边即可。要比二分答案快很多。

  1. 飞行员配对方案问题

两种飞行员抽象成二分图的左右部点,能搭配的两人连边。转化为求二分图最大匹配和方案。最大流之后枚举边看是否满流即可。

  1. 软件补丁问题

状压,将每个 bug 是否被修复过压成一个 20 位的二进制数作为状态,将补丁会起到的作用之间的点连有向边,权为使用补丁的耗时,那么起点为状态全 \(0\),重点为状态全 \(1\),跑最短路即可。

  1. 太空飞行计划问题

trick:最大权闭合子图问题。求解套路:将正收益连源点,负支出取正值连汇点,原先的从属关系连INF边(这里依旧是保持关系,有防止割断的含义)。答案即为总收益减去最小割。考虑最小割在图中的本质,割断收益的边表示放弃放弃了收益,割断支出的边表示留下相应的收益,但是要付出支出。

最大权闭合子图问题模板。将每项实验连向源点,容量为收益;仪器连向汇点,容量为购买所需费用。实验连向所需的仪器,容量为INF。需要注意的是输出方案。不能直接通过每个点与源汇边之间的残量来判断。考虑这样一条路径 \(S \rightarrow u \rightarrow v \rightarrow T\) 三条边的容量都相等,这样当我们跑一遍之后三条边都会满流,这样判断的话就要割三条,实际上只需要割断一条。常用的方法是从源点开始在残量网络上深搜打标记。

  1. 试题库问题

每种试题可以属于多种类型,容易想到将试题向种类连边,因为一个试题只能有一种类型,所以边的容量为 \(1\)。依旧是建立超级源汇的套路,源点连试题,每个题只有一道,容量为 \(1\)。种类连向汇点,容量为这类题的数量。接着跑最大流,如果流量与试题总数不相等,那就说明问题无解。如果有解,我们检测一下题目与种类相连的哪些边上有流量,那就说明这个题属于这个种类,遍历统计答案即可。

  1. 最小路径覆盖问题

trick:最小路径覆盖 = 总点数 - 最大流

假设原先图上有 \(n\) 条路径,每条路径覆盖一个点。每次合并两条首尾相接路径,可以使原图中的路径数减少 \(1\)。对于每个点拆点 \((a_i,b_i)\),连边容量为 \(1\)。对于原图中一条 \((x,y)\) 的边,我们可以选择合并 \(x\)\(y\),所以连边 \((a_x,b_y)\)。建立源汇,连边 \(S,a_i\)\(b_i,T\),因为每个节点最多合并一次,因此容量均为 \(1\)。最后最大流即为最多可以合并的路径条数,拿总点数减去最多合并数即为最小路径条数。输出方案没有什么好的方法,只能并查集加遍历残量网络构造。

  1. 魔术球问题

最小路径覆盖问题变式。考虑为什么会是变式,因为我们要尽可能在一根柱子上放多的球,对于有限数量的球,我们就要使用尽可能少的柱子。那么不难转化成小球代表每一个节点,而最大流量就是所需要柱子的数量。由于是按顺序放,所以如果新加入一个球,那么对于每个比它标号小的球,如果可以相加凑成完全平方数的向新球连边。源汇向小球所代表的节点连边。每次新建边后,就相当于尝试在残量网络上增广。如果残量网络上的最大流为 \(0\) 说明已经无法再放新的球了,这时候就只能增加柱子了。因此当新加入 \(i\) 时 DAG 的 路径数大于柱子数时,答案为 \(i - 1\)

  1. 最长不下降子序列问题

第一问先 DP 跑出每个位置 \(i\) 的最长不下降子序列长度 \(f_i\)。对于第二问,建立源汇,因为每个位置只能用一次,拆点并连边容量 \(1\)。如果 \(f_i = 1\) 说明在原序列上这个位置可以作为转移的起点,源点向入点连边容量为 \(1\);如果 \(f_i = ans1\) 说明在原序列上这个位置可以作为转移的终点,出点向汇点连边容量为 \(1\)。如果对于两个位置 \(j < i\),有 \(a_i \geq a_j \wedge f_i = f_j + 1\),那么说明在原序列上两个位置可以发生转移,\(j\) 的出点向 \(i\) 的入点连边,容量为 \(1\)。跑最大流即可。对于第三问,只需要将源点向 \(1\) 的入点,\(1\) 的入出点之间,\(n\) 的入出点之间,\(n\) 的出点向汇点间的容量改成 INF 即可。

  1. 航空路线问题

从西段出发再从东端回来,实际等价于从西段出发两次。每个城市只能经过一次,所以拆点在点上加限制,容量为 \(1\) 费用为 \(1\)。可以抵达的城市就连容量为 \(1\) 费用为 \(0\)。源向起点,终点向汇各连一条容量为 \(2\) 的边表示跑两次。如果最大流不是 \(2\) 则无解,否则最佳航空路线即为最大费用最大流。输出方案还是搜索加打标记做。

  1. 方格取数问题

trick:最小割中将容量设为 INF 有防止割断的含义。

同样是方格图问题,不妨跟着套路来,按照奇偶性进行染色。考虑将问题转化,从方格中删去若干个数,使得剩下的数没有边相连,让删去的数的和尽可能小。将点上的值转化为容量,源连白点,黑点连汇,容量均为对应方格上的数。那么割断这条边的含义即为删去这个数。将互斥的格子进行连边,方向为白到黑(坑点),容量为 INF。割要保证图不连通,就意味着不再有互斥的方格。中间的边表示的是一种关系,所以割掉没有任何的意义,因此将其容量设为 INF 使其不会被割断。假设图中还有互斥的方格,它们就可以通过中间的 INF 边联通图,与得到的是割的结论不同。使剩下的数尽可能大,就要使割尽可能小,最大流求最小割即可。

  1. 机器人路径规划问题

完全不会,等拿了图灵奖再回来做。

  1. 圆桌问题

类似于试题库问题。将人看作流量,每个单位在一张桌子上只能有一个人,容易想到单位向桌子连边,容量为 \(1\)。套路的建立超级源汇,源点连向每个单位,容量即为单位的人数,桌子连向汇点,容量即为桌子所能容纳的人数。跑最大流即可。检测是否有解和输出解的方案和试题库问题相同。

  1. 骑士共存问题

典型方格图类问题。依然按照每个格子“行加列”的奇偶性进行染色,骑士的走法使得同种颜色间没有连边,所以可以得到一张二分图。求最多放多少个点使得互相不会攻击,相当于求这个二分图的最大独立集,答案就是总点数减去最小割,再去掉是障碍的点。建立超级源汇,分别连黑点和白点,不会互相攻击的格子连,容量均为 \(1\),互相攻击的格子连容量为无穷大的边,求最小割即可。

  1. 深海机器人问题

每个地方的数只能取一次,但是可以经过多次,这和方格取数加强版很像,考虑拆点,对于每个点入点和出点间连 INF 边表示可以被同时经过和经过无限次。只能向上和右走,每个点的出点向其上、右点的入点连边,容量为 \(1\) 费用为路径上生物标本的价值,表示只能取一次;也向出点连边,容量为INF费用为 \(0\) 表示可以经过无限次,但是并不会有收获。建立源汇,源点连每个出发点的入点,费用为 \(0\),容量为可以在此出发的机器人数量;每个目的地的出点连汇点,费用为 \(0\),容量为可以在此离开的机器人数量。最大费用最大流求解即可。

  1. 火星探险问题

和深海机器人类似,还是拆点分成两种边(有石头走一次和没石头走无限次)跑费用流。输出方案也是套路的搜索遍历。

  1. 最长 k 可重区间集问题

考虑费用流。记离散化前左右端点为 \(l,r\),离散化后为 \(L,R\)。问题可以转化成挑选尽可能长的区间,对于每个位置最多被覆盖 \(k\) 次。对离散化后的数轴上每个位置 \(i\)\(i\)\(i + 1\) 连容量为 \(INF\),费用为 \(0\) 的边;对于每对 \(L\)\(R\) 连容量为 \(1\),费用为 \(r-l\) 的边。建立源汇,源点向 \(1\) 连容量为 \(k\),费用为 \(0\) 的边。跑最大费用最大流,这样只要有流量,就会优先走 \((L,R)\) 的边。因为题目保证了是开区间,所以不用考虑端点问题。如果是闭区间改成 \(L\)\(R+1\) 连边即可。

  1. 最长 k 可重线段集问题

将线段向 \(x\) 轴投影即可转化成可重区间集问题。现在唯一的问题在于如果有平行于 y 轴的直线,会出现左右端点重合的情况,与开区间冲突。有一个智慧方法是左右端点都扩大两倍,如果左右端点重合,将右端点再 \(+1\),否则左端点 \(+1\) 即可。 剩下的部分和上一道题完全相同。

  1. 汽车加油行驶问题

显然有动态规划做法,记 \(dp_{i,j,k}\) 表示在 \((i,j)\) 还剩 \(k\) 个油的最小花费,跑一个类似于最短路的东西就好了。

如果使用网络流做法,难以控制油量的问题。考虑分层图,将一个节点拆成 \(k\) 个点,表示剩余相应的油量。每个点的不同油量向其可以到达的点的相应油量减一的节点连边,容量为 \(1\),代价为 \(0\)。最底层节点,即表示没有油的节点,向最高层节点,即满油的节点连费用为额外设加油站以及加满油的代价的边。对于有加油站的节点,由于强制加油,所以每个低层节点都向最高层节点连费用为加满油的代价的边。建立源汇,跑最小费用最大流即可。

  1. 孤岛营救问题

钥匙数量不多,直接状压加搜索,做完了才想起来和 [TJOI2009] 宝藏 是一个题。

  1. 数字梯形问题

三问都用最大费用最大流求解。对于第一问,点边都只能经过一次。对于点的限制,考虑拆点,容量为 \(1\) 费用为这个点上的数字。对于边的限制,每个点 \((i,j)\) 的出点向 \((i+1,j)\)\((i+1,j+1)\) 的入点连边,容量为 \(1\) 费用为 \(0\) 表示每条边只能经过一次。源点连向第一层点的入点,最后一层点的出点连向汇点,容量均为 \(1\),费用为 \(0\)。对于第二问,可以经过相同节点,将每个点入点和出点间的边容量改为 INF,表示可以无限次经过。需要注意的是最后一层点的出点连接汇点的边容量也要改成 INF。对于第三问,可以经过相同节点和相同边,将点和点之间的连边容量改为 INF,表示可以无限次经过。

  1. 运输问题

仓库和商店的分类很直观的给人二分图的感觉,能够自然联想到建立超级源汇。货物的单位数量实质就是容量,运输费用就是费用。将源点向仓库和商店向汇点连给定容量的边,花费均为 \(0\);仓库和商店之间连无限容量的边,花费为给定的值。跑费用流即可。

  1. 分配问题

类似于运输问题。人和工作构成二分图的两侧,建立超级源汇,源点连向人,工作连向汇点,容量均为 \(1\),费用为 \(0\)。人向工作连边,每个人只能选一项工作,边的容量为 \(1\),费用为给定的产生的效益,跑费用流即可。

  1. 负载平衡问题

做惯了二分图的模型,这个题题意中只有一个事物,所以莫名其妙想要拆点。将一个仓库拆成入点和出点,流的定义即为仓库中实时的货物数量。由于最后要求各个仓库货物相等,所以出点连向汇点,容量均为 \(\frac{1}{n} \sum_{i=1}^{n} a_i\);源点连入点,容量就是初始的每个仓库的货物数量。这个时候流已经有了定义,但是并不能体现出“代价最小”,所以需要再定义费用,跑费用流。尽管题目中说货物只能在相邻的仓库中运输,但是不妨将一个仓库的入点连向每个仓库的出点。由于货物可以随便转,所以容量均设成INF。费用即为两仓库间的距离,注意正反走法取较小值。这个题目 \(n\) 很小,即便边数很多,依然能够通过。

最大流

1.[USACO07OPEN]Dining G

发现食物和饮料对牛都有限制,所以把牛放在中间,两边连对应的食物和饮料,再由食物和饮料连向源汇。

但是这样有一个问题,不能满足每个牛只拥有一种食物和饮料。考虑通过拆点限制容量,将一头牛拆成入点和出点,中间连一条容量为 \(1\) 的边即可。跑最大流得到答案。

2.Steady Cow Assignment

首先考虑如果钦定了一个范围,即牛只能选择第几到第几喜欢的牛棚,怎样判定选择的范围是合法的。源点连牛,牛棚连汇点,牛向其可以选的牛棚连边,容量均为 \(1\),中间的边有流量的含义为选择了这个牛棚,跑一边最大流看流量是否等于牛的总数即可。

选择第几到第几喜欢,考虑到牛棚总数量不大,这个是可以暴力枚举的。显然选择的范围越大,每头牛可供选择的牛棚越多,这是具有单调性的,所以可以二分答案,答案就是选择的范围大小加一。

3.蜥蜴

拆点典中典。

不妨将问题转化为最多有多少只蜥蜴能出去。这样显然要建立源汇,源点连向每个蜥蜴的初始所在的石柱,距离边界小于跳跃距离的石柱连向汇点。每个石柱只能经过一定次数,这种限制很自然想到拆点,中间连容量为相应次数的边,限流表示只能经过这么多次。对于能相互到达的点连INF边,表示联通的关系。跑最大流即可,答案为总蜥蜴数减去最多出去的蜥蜴数。

4.Zoj3229 Shoot the Bullet|东方文花帖

有源汇上下界最大流模板。

建立二分图,每一天为左侧点,每个人为右侧点。普通源向每一天连 \([0,D_i]\) 的边,每个人向普通汇连 \([G_i,INF]\) 的边。

5.[国家集训队]部落战争

最小路径覆盖。每个点朝下方可以到达的点连边,对于路径覆盖我们有结论:覆盖=点数-最大独立集=点数-最小割=点数-最大流。建图按做即可。

6.CF387D George and Interesting Graph

其实是二分图最大匹配。注意到点数很少,所以考虑枚举中心点。对于每个中心点我们和其他点都要有连边。每个点去掉和中心点的连边之外,就只剩下一条入边和一条出边,这个东西就是非常标准的二分图最大匹配形式了。我们要做的就是统计每个点的出度和入度,枚举中心点的时候好算贡献。然后建图跑二分图最大匹配。

对于使一个中心点合法,我们需要操作 \(2 \times n - in_i - out_i -1\),求出的最大匹配为已有边中可同时用的最多的边,记为 \(f\)。那么还需要删除 \(m - in_i - out_i -f\) 条边,加入 \(n - 1 - p\) 条边。

所以最后的答案为 \(\min_{i \in G} {3 \times n - 2 - f - 2 \times (in_i + out_i)}\)

最小割

1.[SHOI2010]最小生成树

使除这一条边以外的边权减一,相当于给这条边边权加一。我们将需要加入的这一条边的两个端点记为源点和汇点。

\(\text{Kruskal}\) 算法可知,在最小生成树中加入连接 \(s \to t\) 的边的充要条件是先前加入的边不能使 \((s,t)\) 联通。也就是说需要在比这条边边权小的边中删掉一些,使得 \((s,t)\) 不连通。

由删边联想至最小割。将比该边边权小的边都加入网络,容量即为删掉这条边的代价,也就是给要删的边的边权加一超过该边的次数,容易知道是 \(val_id - val_i + 1\)

特殊的是由于题目中给定的是无向边,所以我们在网络中双向规约,不论正反,直接建立双向边,容量均为上面的代价。

2.文理分科

trick:模型:有 \(n\) 个物品和两个集合 \(S\)\(T\),把物品 \(i\) 放入 \(S\) 代价为 \(a_i\),放入 \(T\) 代价为 \(b_i\)。此外有若干个形如 \((x,y,z)\) 的限制,表示 \(x\)\(y\) 不放入一个集合代价为 \(z\),求最小代价。做法:建立 \(S\)\(T\) 作为源汇,对于每个物品 \(i\),连边 \(S \to i\)\(i \to T\),容量分别为 \(b_i\)\(a_i\)。对于限制,对两个点连双向边,容量均为 \(z\)。注意到当 \(S\)\(T\) 不相连时,每个 \(i\) 要么与 \(S\) 相连,要么与 \(T\) 相连。割开 \(S \to i\) 表示将 \(i\) 放入 \(T\),割开 \(i \to T\) 表示将 \(i\) 放入 \(S\),割开 \(x\)\(y\) 之间的边表示两物品不在同一个集合。综上,最小割即为最小代价。

集合划分模型。每个人要么选文,要么选理,那么文理就是两个集合。点代表每个人,向源汇连边,容量就是选文或理的收益。对于相邻点选同样科目加分的限制,我们可以将这些点看作一个整体,再建立一个新的点能够表示这个整体,再将新点连向对应的集合,容量为额外的收益。如何能确保这些点能够一直绑定呢?考虑在最小割中INF边有防止隔断的含义,将新点向这些点连双向边,容量为INF,这样就能确保只有这些点都连向一个集合才有收益。答案即为总收益减去最小割。

3.[AHOI2009]最小割

trick:最小割的必须边(一定在最小割中的边)和可行边(被某一种最小割方案包含的边)。概念:显然必须边一定是可行边。首先在最小割中出现的边一定满流,也就是在残量网络上没有流量。但满流不一定是割边,如果该边是割边,在残量网络上一定找不到其两端点的另一条路径。因为如果存在,那么割掉该边还必须割掉另一些边,显然不优。对于必须边,在残量网络上一定有源点和边的入点、边的出点和汇点间存在路径相连。假设上述条件不成立,那么说明在源到入或出到汇的路上就已经被割断了,那么作为中间的这条边就不一定必须被割掉,这与前面的结论矛盾。求法:判断是否联通,考虑 \(\text{Tarjan}\) 判连通性,即先跑最大流,然后在残量网络上 \(\text{Tarjan}\) 找强连通分量,然后枚举边看端点的连通性即可。

模板题,题目中的问题一即为求可行边,问题二即为求必须边。

3.[ICPC-Beijing 2006] 狼抓兔子

trick:平面图最小割等于其对偶图最短路。平面图转对偶图方法:将每个区块编号,两个相邻的区块连边,权值为它们中间边的容量。

平面图转对偶图典题。按照套路编号,对于边缘的边,建立超级源汇,源点连靠左边界和靠下边界的区块,靠右边界和上边界的区块连汇点,其余的按照左、下连右、上的方式建图,然后跑出来的最短路就是最小割。

4.[CEOI2008] order

最大权闭合子图。和太空飞行计划问题很像,只是中间的边不同。假如说没有租机器的限制,源点向工作连边,容量为收入;机器向汇点连边,容量为支出;工作连向所需要的机器,容量为租价。容易发现对于一个机器不可能既割断与工作的连边,又割断与汇点的连边,因为只要割断一个就可形成割。感性理解割断租价边的含义即可知道这样连边的原因。

5.[USACO4.4]追查坏牛奶Pollutant Control

第一问最小割板子。第二问求最小割边的数量,一种好做的方法是把残量网络上满流边容量改为 \(1\),其他边容量改为INF(不包括反向边),再跑一次最大流得到答案。

6.Petya and Graph

发现一条边如果被选择了,那么它的两个端点也会被选择。剩下的就是最大权闭合子图板子。

7.[NOI2009] 植物大战僵尸

首先考虑依赖关系,一个植物如果可以被吃,那么可以攻击它所在位置的植物和它右边的植物一定已经被吃掉了。按照这个关系先把图建出来,限制这个位置的点连向这个点。

手玩样例发现如果在这种连边方式下,环和环所指向的点都无法被吃掉,这些是可以先删掉的。缩点打标记和拓扑排序即可。

吃掉植物有的是代价有的是收益,植物间又还存在依赖关系,所以再套最大权闭合子图即可。

8.[HAOI2017]新型城市化

题目中保证了分为两个城市群,所以显然是个二分图,按题目中建图得到的是“建交城市”的补图,先染色分开。

考虑构成城市群的条件,转化问题就是求删掉哪条边可以使二分图的最大独立集变大。因为最大独立集=总点数-最小点覆盖=最大匹配数,所以可以最大流,至于选择删掉哪些边,就是求最小割的必须边,残量网络上缩点即可。

9.[THUPC2022 初赛] 分组作业

一个人要么选择愿意,要么选择不愿意,所以考虑集合划分模型。

建立源汇并相连,分别表示选择同意或者不同意,容量为选择另一状态的代价。可以用 \(i \to j\) 表示 \(i\) 选择了同意但是 \(j\) 选择了不同意,这个时候需要额外付出 \(e_i\) 的代价,所以建边 \(i \to j\) 容量为 \(e_i\)

对于喜欢关系,我们将题意转化一下,会变成如果 \(A\) 所在的组有不同意且 \(B\) 同意,产生 \(a_i\) 的代价;\(A\) 选择不同意且 \(B\) 所在的组全部同意,产生 \(b_i\) 的代价。这时候我们发现和组内的额外代价有些相似了,只不过后者发生了跨组。因此不妨建立新的节点代表每个小组,在残量网络上如果小组和源(汇)相连表示这个小组合作成功(失败),小组向每个成员连INF边表示关系,即如果小组成功合作但是成员有选择不愿意,代价为INF,这样就可以起到防止割断的作用。

此时再将 \(B\)\(A\) 在的组连边,容量为 \(a_i\)\(B\) 对应的组和 \(A\) 连边,容量为 \(b_i\)。感性理解不难发现符合上面所推出的关系,剩下就是裸的模型流程了。

10.CF103E Buying Sets

最大权闭合子图。首先给选集合的代价取反使得变成最大取值的问题,然后加上 \(INF\),原因下面解释。源点连向集合,权为 \(INF\) 减去选集合的代价,断掉相当于不选集合;元素连向汇点,权为 \(INF\);集合向集合内的元素连边,权为 \(INF\),断掉相当于选元素。断掉集合和元素间的连边显然不优,从而起到了防止隔断的作用。显然有一个割法是 \(n\) 个集合都不选。由于我们给每个权加上了 \(INF\) ,所以选的边必然是 \(n\) 条,不然必然劣于每个都不选。假设选了 \(n-x\) 个集合,那么还有不少于 \(n-x\) 个元素不被割断,所以右边还要割断至少 \(n-x\) 个元素,由此得到割掉的边数不可能少于 \(n\)。因为未选的集合数量加上选了的元素的数量等于 \(n\),所以得到了集合数等于元素数。

费用流

1.Boxes

和负载平衡问题基本相同的一个题,改出点连向汇点的容量为 \(1\) 即可。

但是这个题的 \(n\) 变大了,而且多测,所以巨大的边数达到了不可接受的地步。实际上根本没有拆点的必要,直接跟着题意走。

并成一个点,源汇的连接情况相同,边的内部情况改为每个点只向相邻的点连一条容量INF、费用为 \(1\) 的边,这样边的数量由 \(n^2\) 下降到了 \(2n\),时间复杂度大幅下降。注意多测清空。

2.方格取数

题目中对取数又有次数的限制,又有大小的要求,一个“意义”肯定没法满足,所以用费用流。

注意到每个方格的数只能取一次,这种限制直接考虑拆点,连边容量为 \(1\),表示只能取一次,费用为格子中的数。总共可以走 \(k\) 次,这个限制不好满足,所以还是建立超级源汇,源点向起点 \((1,1)\)、终点 \((n,n)\) 向汇点分别连一条容量为 \(k\) 费用为 \(0\) 的边,表示总共走 \(k\) 次。每个格子的出点向下、右的格子入点连INF边,费用为 \(0\),表示连接的关系。每个格子中的数只能取一次,但是可以经过任意次,所以可以相当于直接略过了这个格子,由上一个点的出点向要去的点的出点连INF边,费用为 \(0\),表示经过。

最后要求最大费用最大流,还是取负数的套路。

3.[SDOI2010]星际竞速

考虑题目中提到访问这些行星恰好各一次,又是对流量的限制,直接考虑拆点。注意到容量表示了行星间的行驶关系,这样并不能表现出所花费时间尽可能少,所以用费用流。每个行星出点向汇点连容量为 \(1\) 费用为 \(0\) 的边表示必须来一次。容易发现两行星之间的路径只可能走一次,对于有路的行星,由引力小的入点连向引力大的出点,容量为 \(1\) 费用为航行时间。飞船可以选择从任意一个行星出发,所以由源点向每个行星入点连一条容量为 \(1\) 费用为 \(0\) 的边表示关系。对于能力爆发模式,由源点向每个星球出点连一条容量为 \(1\) 费用为定位时间的边,表示使用该模式。最小费用最大流求解即可。

4.[SDOI2009] 晨跑

每个十字路口只能经过一次,拆点,容量为 \(1\) 表示限制,但是起点和终点连INF边,表示多次出发。可以互相到达的十字路口连边,费用为街道的长度。容易发现此时最大流即为周期的天数,最小费用即为最短路的长度。

5.[ZJOI2010]网络扩容

板子题。第二问重新建图,连两种边:容量为无限,费用为扩容费用;容量为原容量,费用为 \(0\)。最小费用最大流即可。

6.[SDOI2011]工作安排

新奇的拆边题。产品和员工是很明显的二分图,如果没有分段函数的愤怒值,那就是板子题了。考虑加上分段函数怎么做,如果把员工拆点,那么会增加大量的边,是复杂度陡然提升。注意到分段函数分的段并不多,所以直接将边拆开。人为设一个员工的产品数量为 \(T_0=0,T_{s+1}=\text{INF}\),源点向员工总共连 \(s+1\) 条边,分别为容量 \(T_i-T{i-1}\),费用为 \(W_i\)。最小费用最大流即可。

7.[AT_utpc2011_8] キャッシュ戦略

不会做,My_Youth 秒了,看她的题解

8.[SCOI2007] 修车

平均等待时间最少,就是总等待时间最少。类似于提前计算中的第二个题,一个人到底等了多长时间我们并不好计算,但是一个人到底被等了多长时间我们是好知道的,所以我们费用提前计算,把一个人等的时间摊到每个对其来说需要被等的人身上。我们将维修人员拆点,连边表示第 \(i\) 个车主的车由第 \(j\) 个维修人员修,且是这个维修人员修的倒数第 \(k\) 辆车,那么费用即为 \(k \times tim_{i,j}\),因为倒数第 \(k\) 个维修,算上其自己会共有 \(k\) 个人等待。

posted @ 2023-01-31 13:51  LgxTpre  阅读(57)  评论(1编辑  收藏  举报