BZOJ 1458 浅谈网络流建模及实际应用

本文介绍了如何运用网络流模型解决BZOJ 1458题目的方法。通过将最少士兵数问题转换为求解最大不放置障碍物的数量,建立源点到各行,各列到汇点的网络流图,最终通过最大流算法得出答案。
摘要由CSDN通过智能技术生成

这里写图片描述
世界真的很大
网络流是个神奇的东西233
凡是想不出来的题就往网络流上想吧,总是没错的
尤其是棋盘之类的
这道题也是这样
我第一眼就想到网络流了2333
还是看一下题吧:
description:

有一个M * N的棋盘,有的格子是障碍。现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵。我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵, 第j列至少放置了Cj个士兵。现在你的任务是要求使用最少个数的士兵来占领整个棋盘。

input

第一行两个数M, N, K分别表示棋盘的行数,列数以及士兵的个数。 第二行有M个数表示Li。 第三行有N个数表示Ci。 接下来有K行,每行两个数X, Y表示(X, Y)这个格子是障碍。

output

输出一个数表示最少需要使用的士兵个数。如果无论放置多少个士兵都没有办法占领整个棋盘,输出”JIONG!” (不含引号)

这道题想到网络流就对了一大半了
另外一小半在于思路的转换
题目要求最少的士兵数,也就是说如果正好为l[i],c[i]跑不出满流的话也是可以的,因为网络流处理不了“至少”
思路转换========
每列(行)最少放多少个==每列(行)最多不放多少个
那网络流就可以处理了
所有行连向源点,所有列连向汇点,如果某行某列没有障碍就连一条流量为1的边
源点向所有行连一条边,流量为这行的总点数-l[i];
所有列向汇点连一条边,流量为这列的总点数-c[i];
跑一遍最大流,得到最多不放多少个点,总点数一减就是最少放几个点了。
完整代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值