网络流
1. 最大匹配 = 最小点覆盖。
2. 最小割 = 最大匹配
3. 二分图最大独立集 = 点数 - 最大匹配。
4. 二分图最大团 = 补图最大独立集。
5. DAG 最小链覆盖 = n - 拆点后二分图最大匹配。
6. 最大权闭合子图 = 正权和 - 最小割
网络流 24 题
这个其实不是网络流…
直接设 表示 向 搬运量,然后可以得出等式 ,推下式子即可。
时间复杂度:。
Code
1 | |
二分图最大匹配板子。
直接把试题放左边,类型放右边,让每个试题与它所属的类型连一条流量为 的边,源点向每个试题连流量为 的边,每个类型向汇点连流量为它所需个数的边,跑最大流即可。
输出方案就在残余网络上找满流的边即可。
Code
1 | |
费用流板子
每个代表向每个餐桌连流量为 的边然后跑最大流即可。
最大权闭合子图板子。
考虑让答案为总和-最小割。
源点向所有实验 连流量为其奖金的边,实验 向它所有所需仪器连流量为 表示不能断这条边,然后仪器 向汇点连流量为其费用的边。
那么由于断不了中间的边,所以对于实验 ,要让它不连通,要么断掉源点连它的边,表示不做这个实验。要么断掉它所有所需仪器向汇点连的边,表示要买这些仪器。
会发现答案 = 奖金和 - 左边割 - 右边割 = 奖金和 - 最小割。
跑最大流即可。
输出方案就找在残余网络上和源点连通的实验说明它没割,和源点连通的仪器说明割了。
Code
1 | |
最大独立集板子。
观察可知对棋盘黑白染色后,两个可以互相吃掉的马颜色一定不同,所以把黑的放左边,白的放右边,能互相吃掉的就连边,答案就是 。
Code
1 | |
考虑黑白染色,然后把相邻的点连一条流量为 的边,然后源点向黑点连流量为其权值的边,白点向汇点也连流量为其权值的边。
然后答案就是总和 - 最小割。
Code
1 | |
第一问直接 DP。
对于第二问,设 表示以 开头的最长不下降子序列,那么如果 并且 就连一条从 到 的边,容易发现形成了一张 DAG。
定义一个合法的链表示 ,原题就转化为问能把 DAG 划分为最多多少条互不相交的链。
考虑把由于每个点最多出现 次,那么就把每个点拆成入点和出点,入点向出点连一条长度为 的边,如果有一条 的边,就连一条出点 到入点 的流量为 的边。
然后源点向 的入点 连一条流量为 的边,表示可以从这里开始。 的出点 向汇点连一条流量为 的边,表示可以从这里结束。
跑最大流就是答案。
对于第三问直接把源点向入点 、入点 向出点 、入点 向出点 和出点 向汇点的流量改成 再跑最大流即可。
Code
1 | |
考虑费用流,然后把每天拆成早上和晚上。
早上表示当天所有的干净餐巾,晚上表示当天所有的脏餐巾。
为了保证每天都有足够的餐巾,就要让早上 向汇点连一条流量为 的边,那么这样的话流量就少了 ,考虑从源点向晚上 连一条流量为 且费用为 的边,补上丢失的流量,可以理解为顾客把 个脏餐巾还给了饭店。
然后就让早上 向早上 连一条流量为 费用为 的边表示今天没用的餐巾可以留到明天用。晚上 向晚上 连一条流量 费用为 的边表示这些餐巾可以延迟送洗。
源点向早上 连一条流量为 费用为 的边,表示可以买新餐巾。晚上 向早上 连一条流量为 费用为 的边,表示可以把脏餐巾送到快洗店。同理,晚上 向早上 连一条流量为 费用为 的边,表示可以把脏餐巾送到慢洗店。
然后跑最小费用最大流即可。
Code
1 | |
原题可以转化为找两条点数最多的从 到 从小到大走的路径,且这两条路径除了 和 ,其余点不交。
套路拆点,然后最大流钦定找到 跳路径,最大费用用来找到尽可能多的点。
入点向出点连一条 的边,特别的 和 是 。
然后如果 和 有边,那么就出点 和入点 连一条 的边。
然后源点向入点 连一条 的边,出点 向汇点也连 的边,表示要找到两条合法路径。
然后跑最大费用最大流。
容易发现总点数是最大费用 - 2。
输出方案就在残余网络上找,如果 满流了,就说明走了 这条路径。
于是直接 dfs 两遍即可。
Code
1 | |