[TJOI2009] 战争游戏 题解
分析题意,意思是不能让敌人通过格子之间的移动走出边界,而阻止敌军从一个格子到另一个子的途径是什么——花费敌军要到的格子所需的代价来建墙。
由此如果我们把每个格子之间都建一条边权为终点格子的建墙代价的边,再将源点连向每个敌人边权为无穷大,再把每个边界点向汇点连无穷大的边,最后求一下这张图的最小割不就是答案了吗?(以上建边均不包含起点或终点为障碍或终点为敌人的情况,原因显然。)
于是错误的解法诞生了。
这个看似很对的解法虽然很接近正解了,但为什么是错的呢?
这样建图的话,如果有多个敌人的话,向敌人周围的格子建边可能会产生重复,比如三个敌人坐标分别为 \((i,j),(i+1,j-1),(i+1,j+1)\),此时我们想要在 \((i+1,j)\) 建墙的话,因为三个敌人都向这个坐标连过边,这样不就产生重复了吗。
于是,我们使用拆点法。
将每个坐标(障碍格除外),拆分成两个点,分别作为入点和出点,边权为这个坐标修墙的代价,再将出点向其他他相邻的非障碍且非敌人格的入点连边权为无穷大的边,最后将边界点的出点向汇点连边权为无穷大的边,将源点向敌人格的入点连边权为无穷大的边。
这样就解决了边权重复计算的问题。
最终答案就是这张图的最小割。
Question:
- 这样的建边每两个空格子之间会建两条边,不会导致边权计算重复吗?
- 首先,不这样建边的话显然是错误的,因为不能覆盖所有情况(比如我只能到一个格子而不能从一个格子出去)。其次这样建边只有每个格子拆出来的两个点之间才有非无限大的的连边(最小割一定只会割这些边),并且是单向边,起点和终点只会由起点的出点向终点的入点连的边,即为边权值会计算一次,不会产生重复。
- 建无限大边权的边意义是什么?
- 因为我们要求最小割,就要保持图的联通,但是我们又不能因为这些为了保持图联通而不对答案产生贡献边影响答案,所以建无穷大的边,这样我们求最小割的时候才不会选上这些边。

浙公网安备 33010602011771号