【学术篇】网络流24题--骑士共存问题

啥也不说,先上传送门:luogu3355

显然,骑士的步伐有很好的性质:如果我们为棋盘黑白染色,骑士每一步只会从黑格走到白格,或从白格走到黑格。
(这一点下过国际象棋的人都知道,没下过的画一画也知道)

所以我们把棋盘黑白染色,依次标号,然后将障碍格去掉(单独处理)。我们建立源点S和汇点T,从S向所有黑格依次连容量为1的边,从所有白格依次向T连容量为1的边。然后,为避免重复,我们只将每个黑格向骑士能从此格一步走到的白格连容量为正无穷的边,就建立起了一个网络流图。

下图是以题目样例为例,说明一下该如何建图。
样例图示

图中也添加了很多的说明。。。
所以最后非障碍格中我们不能选的就是网络流图中的最小割。。
那么我们就能够得到下面的式子:

最多放置骑士个数=棋盘上的格子总数-障碍格数-最小割数

代码也就应运而生了..
(我的代码建边方式非常玄学,大家最好不要向我学习。。。)

下面贴代码(码风轻喷..):

//IDE:DEV-C++ 5.7.1
//代码并没有经过VS加工
#include <cstring>
#include <cstdio>
#include <queue>
using std::queue;

#define gc      getchar()
#define cl(a,b) memset(a,b,sizeof(a))

const int MAXV=0x9C44;
const int MAXE=0x186AF<<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值