「题解」网络流 24 题
咕咕咕
飞行员配对方案问题
描述
有 \(m\) 个外籍飞行员和 \((n-m)\) 个英国飞行员,一个外籍飞行员和一个英国飞行员可以派出一架飞机。
给出的外籍飞行员与英国飞行员的配合情况,试求出最多可以派出多少架飞机。
思路
二分图匹配模板题。
每一对配合的外籍飞行员向英国飞行员连边,最后跑一遍二分图最大匹配即为所求。
分配问题
描述
有 \(n\) 件工作要分配给 \(n\) 个人做。第 \(i\) 个人做第 \(j\) 件工作产生的效益为 \(c_{i,j}\) 。试设计一个将 \(n\) 件工作分配给 \(n\) 个人做的分配方案,使产生的总效益最大。
思路
对于第 \(i\) 个人和第 \(j\) 件工作,由 \(i\) 向 \(j\) 连接一条容量任意,费用为 \(c_{i,j}\) 的边。
建立超级源点,向每个人连接一条容量为 \(1\),费用为 \(0\) 的边。
建立超级汇点,向每件工作连接一条容量为 \(1\),费用为 \(0\) 的边。
两次费用流即为所求。
运输问题
描述
有 \(m\) 个仓库和 \(n\) 个零售商店。第 \(i\) 个仓库有 \(a_i\) 个单位的货物,第 \(j\) 个零售商店需要 \(b_j\) 个单位的货物,\(\sum\limits_{i=1}^{m}a_i=\sum\limits_{j=1}^{n}b_j\)。
从第 \(i\) 个仓库运送每单位货物到第 \(j\) 个零售商店的费用为 \(c_{i,j}\)。
试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。
思路
建立超级源点,向第 \(i\) 个仓库连接一条容量为 \(a_i\),费用为 \(0\) 的边。
建立超级汇点,向第 \(j\) 个零售商店连接一条容量为 \(b_j\),费用为 \(0\) 的边。
由第 \(i\) 个仓库向第 \(j\) 个零售商店连接一条容量为正无穷,费用为 \(c_{i,j}\) 的边。
两次费用流即为所求。
圆桌问题
描述
有来自 \(m\) 个不同单位的代表,第 \(i\) 个单位派出了 \(r_i\) 个代表。
餐厅共有 \(n\) 张餐桌,第 \(j\) 张餐桌可容纳 \(c_j\) 个代表就餐。
试求出一个满足要求的代表就餐方案,并满足从同一个单位来的代表不在同一个餐桌就餐。
题解
建立超级源点,向第 \(i\) 个单位连接一条容量为 \(r_i\) 的边。
建立超级汇点,向第 \(j\) 张餐桌连接一条容量为 \(c_j\) 的边。
由第 \(i\) 个单位向第 \(j\) 张餐桌连接一条容量为 \(1\) 的边,这样使得从同一个单位来的代表不会在同一个餐桌就餐。
跑一遍最大流,然后依次扫描每一条连接第 \(i\) 个单位与第 \(j\) 张餐桌的边,若其正向边残余容量为 \(0\),即表示第 \(i\) 个单位中有代表在第 \(j\) 张餐桌就餐。
孤岛营救问题
描述
一个 \(n\times m\) 的迷宫,起点是 \((1,1)\),终点是 \((n,m)\)。南北或东西方向相邻的 \(2\) 个单元之间可能互通,也可能有一扇锁着的门,或者是一堵不可逾越的墙。迷宫中有一些单元存放着钥匙,并且所有的门被分成 \(p\) 类,打开同一类的门的钥匙相同,不同类门的钥匙不同。
从一个单元移动到相邻的单元的时间为 \(1\),试求出从起点到达终点的最短时间。
思路
\(p\leq 10\),考虑状压。
从起点开始 BFS,将当前状态用一个四元组 \((S,x,y,t)\) 表示。\((x,y)\) 表示当前所在位置,\(t\) 表示经过的时间,\(S\) 表示钥匙的获取情况。对相邻结点进行转移即可。
软件补丁问题
描述
有 \(n\) 个错误,\(m\) 个补丁程序。
每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才可以使用。一个补丁在修复某些错误的同时,也会加入另一些错误。运行每个补丁也会耗费一定的时间。
试求出修复所有错误的情况下,最小的总耗时。
思路
状压,设当前状态为二进制数 \(S\),\(S\) 即每个错误的修复情况。该位为 \(0\) 表示该错误尚未被修复,\(1\) 表示改错误已经被修复。
对于当前状态,枚举使用哪个补丁,按照最短路模式进行转移即可。
汽车加油行驶问题
描述
一个 \(n\times n\) 的矩阵,设起点为 \((1,1)\),终点为 \((n,n)\)。
在若干个方格处设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则:
- 加满油后能行驶 \(k\) 条边。出发时汽车已装满油。
- 汽车从一个方格驶向另一个方格时,若方向为上或左,则应付费用 \(b\) ,否则免付费用。
- 汽车在行驶过程中遇油库则应加满油,并付加油费用 \(a\)。
- 在需要时可在当前位置增设油库,并付加油费用 \(a+c\)。
试求出汽车从起点出发到达终点所付的最小费用。
思路
对剩余油量建立分层图。若加油,向第 \(k\) 层连边;若不加油,向当前层深度 \(-1\) 层连边。
最后跑一遍最短路即为所求。