bzoj1458 士兵占领
bzoj1458 士兵占领
有一个 \(M\times N\) 的棋盘,有的格子是障碍。现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵。我们称这些士兵占领了整个棋盘当满足第i行至少放置了 \(L_i\) 个士兵, 第j列至少放置了 \(C_j\) 个士兵。现在你的任务是要求使用最少个数的士兵来占领整个棋盘。
\(M,\ N\leq100\)
网络流,费用流
建出每个为被删除的点 \((i,\ j)\) ,这个点会对 \(tid_i,\ tid_j\) 造成 \(1\) 的贡献。限制每行每列的士兵个数,就把每行每列建成点,连一条边限制容量即可。于是就建出了一个二分图。统计士兵个数可以考虑统计源点流出的容量数,因为每个士兵会流向每行每列两个节点,因此费用会是最终答案的两倍,除以二即可。
对于每行,连边 \((tid_i,\ T,\ L_i,\ 0)\) ,每列同理
对于每个未被删除的点 \((i,\ j)\) ,连边 \((S,\ id,\ \inf,\ 1),\ (id,\ tid_i,\ 1,\ 0),\ (id,\ tid_j,\ 1,\ 0)\)
我的代码交换了 \(M,\ N\) ……
代码
#include <bits/stdc++.h>
using namespace std;const int maxn = 11000, maxm = 1e5 + 10, inf = 1 << 30;
int N, M, K;
bool isv[105][105], vis[maxn];
int S, T, h[maxn], f[maxn], dis[maxn], pre[maxn];struct edges {int nxt, to, w, c;edges(int _n = 0, int _t = 0, int _w = 0, int _c = 0) :nxt(_n), to(_t), w(_w), c(_c) {}
} e[maxm];queue <int> q;void addline(int u, int v, int w, int c) {static int cnt = 1;e[++cnt] = edges(h[u], v, w, c), h[u] = cnt;e[++cnt] = edges(h[v], u, 0, -c), h[v] = cnt;
}bool spfa() {memset(dis, 0x3f, sizeof dis);q.push(S), dis[S] = 0, f[S] = inf;while (!q.empty()) {int u = q.front();vis[u] = 0, q.pop();for (int i = h[u]; i; i = e[i].nxt) {int v = e[i].to;if (e[i].w && dis[u] + e[i].c < dis[v]) {pre[v] = i;f[v] = min(f[u], e[i].w);dis[v] = dis[u] + e[i].c;if (!vis[v]) q.push(v), vis[v] = 1;}}}return dis[T] < 1e9;
}void EK() {int res = 0, tmp = 0;while (spfa()) {tmp += f[T], res += f[T] * dis[T];for (int u = T; u != S; u = e[pre[u] ^ 1].to) {e[pre[u]].w -= f[T], e[pre[u] ^ 1].w += f[T];}}printf("%d", res >> 1);
}int main() {int sr[105], sc[105];scanf("%d %d %d", &N, &M, &K);S = N * M + N + M + 1, T = S + 1;for (int i = 1; i <= N; i++) {scanf("%d", sr + i);addline(N * M + i, T, sr[i], 0);}for (int i = 1; i <= M; i++) {scanf("%d", sc + i);addline(N * M + N + i, T, sc[i], 0);}for (int i = 1, x, y; i <= K; i++) {scanf("%d %d", &x, &y), isv[x][y] = 1;}int R[105], C[105];memset(R, 0, sizeof R);memset(C, 0, sizeof C);for (int i = 1; i <= N; i++) {for (int j = 1; j <= M; j++) {if (!isv[i][j]) {R[i]++, C[j]++;int tid = M * (i - 1) + j;addline(S, tid, inf, 1);addline(tid, N * M + i, 1, 0);addline(tid, N * M + N + j, 1, 0);}}}for (int i = 1; i <= N; i++) {if (R[i] < sr[i]) return puts("JIONG!"), 0;}for (int i = 1; i <= M; i++) {if (C[i] < sc[i]) return puts("JIONG!"), 0;}EK();return 0;
}
转载于:https://www.cnblogs.com/Juanzhang/p/10731448.html
bzoj1458 士兵占领相关推荐
- [BZOJ1458]士兵占领(最大流)
题目描述 传送门 题解 判断JOING!的条件是显然的:如果行或列的总点数减去障碍数还不够li或ci的话,肯定无解. 我的建图比较奇怪. 三排点,分别为每一行,每个点,每一列. s->每一行,l ...
- 【BZOJ-1458】士兵占领 最大流
1458: 士兵占领 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 782 Solved: 456 [Submit][Status][Discuss ...
- bzoj1458 士兵占据
1458: 士兵占据 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 685 Solved: 398 [Submit][Status][Discuss ...
- 天天向上python题目答案_python语言程序设计基础 习题 天天向上的力量(math.pow)...
实例1: 一年365天,,以第一天的能力值为基数1.0,当好好学习时能力值相比前一天提高1%,没有学习时能力值相比前天要降低1%,每天努力和每天放任,一年下来的能力值相差多少? 解析: 如果每天都好好 ...
- 有趣题目和认知合集(持续更新)
写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...
- 2020 CCPC 秦皇岛 K. Kingdom‘s Power(树形DP)
传送门 题目大意 给出一棵根节点为111的树,其中树根上面有无穷的士兵,每分钟我们能调取一队士兵走一条边,如果该节点没有被占领那么会占领该节点,问占领所有节点需要的最少时间. 解题思路 首先要能简单证 ...
- java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())
Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...
- BZOJ ac100题存档
不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...
- [补档]2017-7-29 大佬讲课笔记
网络流 虽然dalao声音不大,但是很好听呢.不过dalao很快的进入正经主题了呢. 基本定义 1. 有n个点,m条有向边,其中源点 s 只有出边,没有入边.汇点 t 只有入边,没有出边. 2. 每条 ...
- [NetworkFlow]网络流建模相关
流 网络流问题本质上是线性规划问题的应用之一,线性规划问题的标准形式是给出一组等式约束和不等式约束,要求最优化一个线性函数. 在流问题中,变量以流量的形式出现在问题中,我们给出一个流网络(以有向图的形 ...
最新文章
- Android源码下载资料
- 20172304 《程序设计与数据结构》第六周学习总结
- 富文本框让最大四百像素_TinyMCE 富文本编辑器 ━━ 基本配置
- Git使用教程:最详细、最浅显
- scala学习 之 环境搭建(一)
- 计算机设备的热量,帮我计算机一下这块冰能吸收多少热量?
- Java SimpleTimeZone setStartRule()方法与示例
- linux内核的配置过程,linux内核的配置机制及其编译过程
- .Net中委托的协变和逆变详解
- Linux 3.2.8 内核启动过程
- 【dell电脑Windows10重启自动修复】重启之后一直修复,又重启(已解决)
- 更新appid失败,登录用户不是该小程序的开发者
- Tornado get/post请求异步处理框架分析
- 【大学生软件测试基础】web版微信登录测试 - 正交表
- 最全工业以太网通讯协议
- OpenXml操作Word的一些操作总结. - 天天不在
- centos8 处理挖矿程序攻击
- uniapp 在h5 模式下扫码
- 7条命令在docker中部署Mesos集群
- 哪些些实验适合用计算机实测,计算机实测物理实验2014年讨论内容
热门文章
- hadoop 如何连beeline_Hadoop家族新成员Hbase重磅来袭
- 异步ajax动态实现级联,JQuery异步加载无限下拉框级联功能实现示例
- 浮动网页html特效代码,网页上可点击关闭的纯代码无图版浮动tips提示特效代码...
- 260.只出现一次的数字III
- 编写程序销毁一个单链表
- python graphviz_Python中Graphviz的输出问题
- micropython支持stm32型号_轻松几步实现在STM32上运行FreeRTOS任务
- 2015-11-30 20:59:08之自力更生
- JDK11使用HSDB
- java book_java_book java 图书管理系统 GUI - 下载 - 搜珍网