网络流24题集合

网络流 24 的题目还比较有意思,涵盖了许多常见套路,值得刷一边。只是有些题的输入输出实在是太屑了(恼)。

搭配飞行员

一架飞机要一个正驾驶和一个副驾驶,只有特定的正副驾驶组合才能飞,问最大起飞个数。


十分基本的二分图匹配。

太空飞行计划

有一堆仪器和一堆实验,每个实验要求实验室里有某些仪器才能做。买仪器要花钱,做实验能赚钱,问最多赚多少钱。要求输出方案。


常见思路:把最大可选择转化为最小可不选择。

建最小割模型,左边仪器价格边,割掉表示买仪器,右边实验收益边,割掉表示不做实验,中间无穷边。如果有一个实验不割表示做,而要求的某个仪器不割表示不买,中间的无穷边就导通,表示方案不合法。

最后用实验总收益减去最小负收益得到答案。

输出方案想不太清楚,题解说统计没有被割掉的实验边,就表示这些实验选做,看上去莫得问题但总感觉怪怪的。

吐槽:这题的输入输出真是人间之屑。

最小路径覆盖

给一个 DAG ,让你用最少的路径条数覆盖所有点,路径之间不能交叉。


似乎比较多问题可以转化到这个模型,需要熟悉。

还是老套路,最小可选转化为最大可不选。这道题里就是最小路径数转化为最多可以连接的节点对数。

所以左边所有点连 1 边,右边是另一组所有点,连 1 边,表示每个点最多出一次入一次。中间是有向图中的边,入点是左边,出点是右边,表示一个可连接点对。

最后用总点数减去最多可连接点数就得到答案。因为每连接一对点就少一条链。

魔术球

有 n 个柱子,现往上依次放入编号为 1, 2, 3, 4, … 的球,要求:

  1. 每次只能在某跟柱子的最上面放球
  2. 同一根柱子中,相邻两个球的和为完全平方数

问你最多能放多少个球,并输出方案。


直接最大流难做,应该转化为可行性问题。一个柱子本质就是一个链表,每个球都指向自己下面的球。柱子本身可以抽象成一个节点,任何人都可以都往上连,表示新开一个节点。除了柱子就只能连向值比自己小,而且和为完全平方数的点。这样左边是 m 个点,右边是 m 个点 + n 个柱子点,左边往右边可以放的点连边,权值为 1 。s 到左边,右边到 t 都连权值为 1 的边,表示一个点只能用一次。如果跑满流就表示存在合法解,这其实也是个完美匹配问题。

二分答案找最优解可能太慢,可以每次在残余网络的基础上额外左右加两个点和若干边,然后再执行 dinic ,如果流量增量为 1 就表示此答案合法,可以继续往上加。

圆桌聚餐

有来自 mm 个不同单位的人吃饭,每个单位有 rir_i 个人。餐厅有 nn 张桌,每张桌有 cic_i 个坐。

现要求找出方案,使没有两个同一单位的人在同一桌就餐,且所有人都能吃上饭。


很基本的建模。

二分图,左边是单位,右边是桌,权值分别是人数和坐数,然后每个单位到桌连 1 边,表示一个单位最多有一个人去某个桌。

直接跑最大流,满流就表示有方案。再根据中间边的剩余流量输出方案,如果单位 ii 到 桌 jj 的边满流,就表示 ii 单位派了一个人去 jj 桌。

方格取数

在一个 n×mn \times m 的棋盘中,每个方格有一个正整数。

现从方格中取数,使任意 2 个数所在方格中没有公共边,且取出的数的总和最大。


注意棋盘题,棋盘是一个非常套路的二分图模型。

黑白染色之后,白色在左边,黑色在右边,就形成一个二分图。二分图左右两边某些点不能同时选。

从源到左边和从右边到汇都是格子里的值,左右两边冲突点之间连无穷边。

这样割掉一个格子就表示不选,如果有两个冲突点都没有割,他们中间的无穷边就导通,表示方案不合法。

最小割求出最小不选点,用总数减去就是答案。

这道题虽然也用到了常见套路最大转最小,但反而不太需要刻意思考这方面。只要首先注意到棋盘图转二分图,很自然就想到最小割。