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 士兵占领相关推荐

  1. [BZOJ1458]士兵占领(最大流)

    题目描述 传送门 题解 判断JOING!的条件是显然的:如果行或列的总点数减去障碍数还不够li或ci的话,肯定无解. 我的建图比较奇怪. 三排点,分别为每一行,每个点,每一列. s->每一行,l ...

  2. 【BZOJ-1458】士兵占领 最大流

    1458: 士兵占领 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 782  Solved: 456 [Submit][Status][Discuss ...

  3. bzoj1458 士兵占据

    1458: 士兵占据 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 685  Solved: 398 [Submit][Status][Discuss ...

  4. 天天向上python题目答案_python语言程序设计基础 习题 天天向上的力量(math.pow)...

    实例1: 一年365天,,以第一天的能力值为基数1.0,当好好学习时能力值相比前一天提高1%,没有学习时能力值相比前天要降低1%,每天努力和每天放任,一年下来的能力值相差多少? 解析: 如果每天都好好 ...

  5. 有趣题目和认知合集(持续更新)

    写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...

  6. 2020 CCPC 秦皇岛 K. Kingdom‘s Power(树形DP)

    传送门 题目大意 给出一棵根节点为111的树,其中树根上面有无穷的士兵,每分钟我们能调取一队士兵走一条边,如果该节点没有被占领那么会占领该节点,问占领所有节点需要的最少时间. 解题思路 首先要能简单证 ...

  7. java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...

  8. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  9. [补档]2017-7-29 大佬讲课笔记

    网络流 虽然dalao声音不大,但是很好听呢.不过dalao很快的进入正经主题了呢. 基本定义 1. 有n个点,m条有向边,其中源点 s 只有出边,没有入边.汇点 t 只有入边,没有出边. 2. 每条 ...

  10. [NetworkFlow]网络流建模相关

    流 网络流问题本质上是线性规划问题的应用之一,线性规划问题的标准形式是给出一组等式约束和不等式约束,要求最优化一个线性函数. 在流问题中,变量以流量的形式出现在问题中,我们给出一个流网络(以有向图的形 ...

最新文章

  1. Android源码下载资料
  2. 20172304 《程序设计与数据结构》第六周学习总结
  3. 富文本框让最大四百像素_TinyMCE 富文本编辑器 ━━ 基本配置
  4. Git使用教程:最详细、最浅显
  5. scala学习 之 环境搭建(一)
  6. 计算机设备的热量,帮我计算机一下这块冰能吸收多少热量?
  7. Java SimpleTimeZone setStartRule()方法与示例
  8. linux内核的配置过程,linux内核的配置机制及其编译过程
  9. .Net中委托的协变和逆变详解
  10. Linux 3.2.8 内核启动过程
  11. 【dell电脑Windows10重启自动修复】重启之后一直修复,又重启(已解决)
  12. 更新appid失败,登录用户不是该小程序的开发者
  13. Tornado get/post请求异步处理框架分析
  14. 【大学生软件测试基础】web版微信登录测试 - 正交表
  15. 最全工业以太网通讯协议
  16. OpenXml操作Word的一些操作总结. - 天天不在
  17. centos8 处理挖矿程序攻击
  18. uniapp 在h5 模式下扫码
  19. 7条命令在docker中部署Mesos集群
  20. 哪些些实验适合用计算机实测,计算机实测物理实验2014年讨论内容

热门文章

  1. hadoop 如何连beeline_Hadoop家族新成员Hbase重磅来袭
  2. 异步ajax动态实现级联,JQuery异步加载无限下拉框级联功能实现示例
  3. 浮动网页html特效代码,网页上可点击关闭的纯代码无图版浮动tips提示特效代码...
  4. 260.只出现一次的数字III
  5. 编写程序销毁一个单链表
  6. python graphviz_Python中Graphviz的输出问题
  7. micropython支持stm32型号_轻松几步实现在STM32上运行FreeRTOS任务
  8. 2015-11-30 20:59:08之自力更生
  9. JDK11使用HSDB
  10. java book_java_book java 图书管理系统 GUI - 下载 - 搜珍网