「JSOI2015」圈地

传送门

显然是最小割。

首先对于所有房子,权值 \(> 0\) 的连边 \(s \to i\) ,权值 \(< 0\) 的连边 \(i \to t\) ,然后对于所有的墙,连两条边,连接起墙两边的房子,容量就是修墙的费用,然后直接用权值和 - 最小割就是最大收益。

参考代码:

  1. #include <cstring>
  2. #include <cstdio>
  3. #define rg register
  4. #define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
  5. template < class T > inline T min(T a, T b) { return a < b ? a : b; }
  6. template < class T > inline void read(T& s) {
  7. s = 0; int f = 0; char c = getchar();
  8. while ('0' > c || c > '9') f |= c == '-', c = getchar();
  9. while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
  10. s = f ? -s : s;
  11. }
  12. const int _ = 400 * 400 + 5, __ = 3 * 400 * 400 + 5, INF = 2147483647;
  13. int tot = 1, head[_]; struct Edge { int v, w, nxt; } edge[__ << 1];
  14. inline void Add_edge(int u, int v, int w) { edge[++tot] = (Edge) { v, w, head[u] }, head[u] = tot; }
  15. inline void link(int u, int v, int w) { Add_edge(u, v, w), Add_edge(v, u, 0); }
  16. int n, m, x, sum, s, t, dep[_], cur[_];
  17. inline int bfs() {
  18. static int hd, tl, Q[_];
  19. memset(dep, 0, sizeof (int) * (t - s + 1));
  20. hd = tl = 0, Q[++tl] = s, dep[s] = 1;
  21. while (hd < tl) {
  22. int u = Q[++hd];
  23. for (rg int i = head[u]; i; i = edge[i].nxt) {
  24. int v = edge[i].v, w = edge[i].w;
  25. if (dep[v] == 0 && w)
  26. dep[v] = dep[u] + 1, Q[++tl] = v;
  27. }
  28. }
  29. return dep[t] > 0;
  30. }
  31. inline int dfs(int u, int flow) {
  32. if (u == t) return flow;
  33. for (rg int& i = cur[u]; i; i = edge[i].nxt) {
  34. int v = edge[i].v, w = edge[i].w;
  35. if (dep[v] == dep[u] + 1 && w) {
  36. int res = dfs(v, min(w, flow));
  37. if (res) { edge[i].w -= res, edge[i ^ 1].w += res; return res; }
  38. }
  39. }
  40. return 0;
  41. }
  42. inline int Dinic() {
  43. int res = 0;
  44. while (bfs()) {
  45. for (rg int i = s; i <= t; ++i) cur[i] = head[i];
  46. while (int d = dfs(s, INF)) res += d;
  47. }
  48. return res;
  49. }
  50. inline int id(int i, int j) { return (i - 1) * m + j; }
  51. int main() {
  52. #ifndef ONLINE_JUDGE
  53. file("cpp");
  54. #endif
  55. read(n), read(m), s = 0, t = n * m + 1;
  56. for (rg int i = 1; i <= n; ++i)
  57. for (rg int j = 1; j <= m; ++j) {
  58. read(x), sum += x > 0 ? x : -x;
  59. if (x > 0) link(s, id(i, j), x);
  60. if (x < 0) link(id(i, j), t, -x);
  61. }
  62. for (rg int i = 1; i <= n - 1; ++i)
  63. for (rg int j = 1; j <= m; ++j)
  64. read(x), link(id(i, j), id(i + 1, j), x), link(id(i + 1, j), id(i, j), x);
  65. for (rg int i = 1; i <= n; ++i)
  66. for (rg int j = 1; j <= m - 1; ++j)
  67. read(x), link(id(i, j), id(i, j + 1), x), link(id(i, j + 1), id(i, j), x);
  68. printf("%d\n", sum - Dinic());
  69. return 0;
  70. }

「JSOI2015」圈地的更多相关文章

  1. 「JSOI2015」symmetry

    「JSOI2015」symmetry 传送门 我们先考虑构造出原正方形经过 \(4\) 种轴对称变换以及 \(2\) 种旋转变换之后的正方形都构造出来,然后对所得的 \(7\) 个正方形都跑一遍二维哈 ...

  2. 「JSOI2015」串分割

    「JSOI2015」串分割 传送门 首先我们会有一个贪心的想法:分得越均匀越好,因为长的绝对比短的大. 那么对于最均匀的情况,也就是 \(k | n\) 的情况,我们肯定是通过枚举第一次分割的位置,然 ...

  3. 「JSOI2015」isomorphism

    「JSOI2015」isomorphism 传送门 我们还是考虑树哈希来判同构. 但是我们需要使用一些特殊的手段来特殊对待假节点. 由于是无向树,我们首先求出重心,然后以重心为根跑树哈希. 此处我们不 ...

  4. 「JSOI2015」地铁线路

    「JSOI2015」地铁线路 传送门 第一问很简单:对于每条线路建一个点,然后所有该条线路覆盖的点向它连边,权值为 \(1\) ,然后它向所有线路上的点连边,权值为 \(0\) . 然后,跑一边最短路 ...

  5. 「JSOI2015」染色问题

    「JSOI2015」染色问题 传送门 虽然不是第一反应,不过还是想到了要容斥. 题意转化:需要求满足 \(N + M + C\) 个条件的方案数. 然后我们就枚举三个数 \(i, j, k\) ,表示 ...

  6. 「JSOI2015」最小表示

    「JSOI2015」最小表示 传送门 很显然的一个结论:一条边 \(u \to v\) 能够被删去,当且仅当至少存在一条其它的路径从 \(u\) 通向 \(v\) . 所以我们就建出正反两张图,对每个 ...

  7. 「JSOI2015」套娃

    「JSOI2015」套娃 传送门 考虑贪心. 首先我们假设所有的套娃都互相不套. 然后我们考虑合并两个套娃 \(i\),\(j\) 假设我们把 \(i\) 套到 \(j\) 里面去,那么就可以减少 \ ...

  8. 「JSOI2015」非诚勿扰

    「JSOI2015」非诚勿扰 传送门 我们首先考虑一名女性选中她列表里第 \(x\) 名男性的概率(假设她列表里共有 \(s\) 名男性): \[ P = p \times (1 - p) ^ {x ...

  9. 「JSOI2015」salesman

    「JSOI2015」salesman 传送门 显然我们为了使收益最大化就直接从子树中选大的就好了. 到达次数的限制就是限制了可以选的子树的数量,因为每次回溯上来都会减一次到达次数. 多种方案的判断就是 ...

随机推荐

  1. JS高级---沙箱

    沙箱 沙箱: 环境, 黑盒, 在一个虚拟的环境中模拟真实世界, 做实验, 实验结果和真实世界的结果是一样, 但是不会影响真实世界     全局变量 var num=10; console.log(nu ...

  2. SQL Server 检查和处理死锁问题

    SELECT spid, blocked, DB_NAME(sp.dbid) AS DBName, program_name, waitresource, lastwaittype, sp.login ...

  3. 【音乐欣赏】《Heart Made of Stone》 - The Tech Thieves

    曲名:Heart Made of Stone 作者:The Tech Thieves Yeah It's been years now and I wonder Is it over? Do you ...

  4. Action路径问题

    上网搜了一下,先给个解决方案,贴个图保存,后面再专门写一写总结.

  5. android toolbar 显示返回按钮并改变按钮颜色

    <android.support.design.widget.AppBarLayout android:id="@+id/about_appbar" android:layo ...

  6. 第三十二篇 玩转数据结构——AVL树(AVL Tree)

          1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...

  7. 洛谷P1327 数列排序

    https://www.luogu.org/problem/P1327 #include<bits/stdc++.h> #define Ll long long using namespa ...

  8. Junit +cucumber 运行报错 initiallizationError

    step1: 访问 https://search.maven.org/  搜索下载相关jar包 step2: 访问 http://maven.outofmemory.cn/info.cukes/cuc ...

  9. 2.17NOIP模拟赛(by hzwer) T2 小奇的序列

    [题目背景] 小奇总是在数学课上思考奇怪的问题. [问题描述] 给定一个长度为 n 的数列,以及 m 次询问,每次给出三个数 l,r 和 P, 询问 (a[l'] + a[l'+1] + ... + ...

  10. EAC3 Adaptive Hybrid Transform (AHT)

    adaptive hybrid transform 由两个linear transforms级联组成. 第一个transform为MDCT,MDCT使用KBD window产生256个transfor ...