P3866 [TJOI2009] 战争游戏 题解

传送门:P3866 [TJOI2009] 战争游戏

Solution

首先考虑如何建图。

先看建源点和汇点的原因:

  • 建源点:有若干支不同的军队需要拦截,所以要将他们所在点都与源点连接,以跑网络流。
  • 建汇点:有若干个通向图外的可行边界点,也要将它们都与汇点连在一起,以跑网络流。

这样一来,源点的汇点的建图方式就可以轻易得到了:

  • 源点:自源点向所有军队的所在点相连,流量为 i n f inf inf
  • 汇点:将所有可以通行的图内边界点与汇点相连,流量为 i n f inf inf

如此,解决此题的具体方式也就出来了:求最小割。

上文所述,将军队都与源点相连,可行边界点都与汇点相连,则要想阻止军队出图,就是要割去一些带权值的边,既能使源点和汇点不连通,又要使割去边的权值之和最小

因为最大流等于最小割,所以这道题就转化为求最大流。那么上述的边权在下文就变成了流量。

再看如何建图的中间部分:

  1. 很明显,要将所有的可行点(即该点没有障碍物)和它四周可以到达的点连边,流量为 i n f inf inf

  2. 对于空地,发现它有一个轰炸值(即轰炸所费炸药数),特别地,对于军队所在点,轰炸值为 0。按上文所述,要想将一个点权转化为边权,也就是一条边的流量,那么方法呼之欲出:拆点。

  3. 所以,我们将每一个可行点拆成两个点,入点和出点,并在它们之间连边。若点为空地,则边的流量即为空地的轰炸值,这样即可限制通过该空地点的流量;若点为军队所在点,则边的流量为 i n f inf inf

  4. 最后再来说入点和出点的连边:对于所有可行点,使用出点向四周可行点的入点连边;对于军队所在点,则自源点与该点的入点连边。

建图就说完了,剩下的就只有最大流板子了。

特别:注意点的编号的处理。

Code

更多详情见代码及注释。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;

#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define maxn 2005
#define maxm 40005
#define inf 2147483647
int n, m, d, nm;
int c[maxn][maxn], cntc, l[maxm], r[maxm], ans;
int s, t, p[maxn][
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值