1 条题解
-
0
题解
思路
根据最大流最小割定理,答案等于把最左列与最右列分开的最小走廊容量和。对每个网格节点只需决定它属于源侧还是汇侧;一条走廊的两端属于不同侧时,它的容量计入割。由于 ,可用 位二进制数表示一列的分割状态。
做法
子任务 1:枚举全部中间列
第一列必须全在源侧,最后一列必须全在汇侧。枚举其余 个节点的侧归属,直接累加跨越两侧的水平和竖直走廊容量。
子任务 2:枚举相邻列状态
设 为处理到当前列,该列源侧节点集合为 时的最小割。从上一列 转移到 时,需加上 中各行对应的水平走廊容量,以及 中相邻两位不同的竖直走廊容量。直接枚举 即可。
子任务 3:带权汉明距离变换
一次列转移的水平部分是
$$g[S]=\min_P\left(dp[P]+\sum_{r:P_r\ne S_r}h_r\right).$$先令 。依次处理每一位 ,对不含该位的 ,用一次或不使用容量 的翻转同时更新 与 。处理完 位后, 就是所有上一列状态的最小值。再为每个 加上当前列的环边割代价。
初始只有全 状态代价为 ,最终答案为最后一列全 状态的 DP 值。
复杂度
三层时间复杂度依次为 、 和 ;满分做法空间复杂度为 。
正确性证明
任何一个源汇割都唯一对应于每列的一个位掩码。转移中的带权汉明距离恰好计入相邻列间被割断的走廊,当前列环边代价恰好计入同列被割断的走廊,每条边被计数一次。超立方体变换对每一位选择“保持”或“翻转并付费”,因此结果等于枚举所有 的最小值。故 DP 得到所有源汇割的最小容量,由最大流最小割定理即为所求最大流。
- 1
信息
- ID
- 1473
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者