题意

给你一个\(N×M\)的草地,有高地有低地。
收割机从低地走到高地或者从高地走到低地都要花费用\(A\),你可以花费用\(B\)把一块高地变成低地,或者把一块低地变成高地。收割机每行每列都是必须要跑一趟的。

求最小花费。

解析

\(S\)向低地、高地向\(T\)建权为\(B\)的边,相邻的地之间建边权为\(A\)的边。

然后求最小割。

相同类型的地之间为什么也要建边呢?因为类型是可以改变的。

#include <bits/stdc++.h>
#define FOPI freopen("in.txt", "r", stdin)
#define FOPO freopen("out.txt", "w", stdout)
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int maxn = 50 * 50 + 1000;
const int maxm = 1e5 + 100;struct Edge
{int to, next, cap, flow;
}edge[maxm];int tot;
int head[maxn];void init()
{tot = 2;memset(head, -1, sizeof(head));
}void build(int u, int v, int w, int rw = 0)
{edge[tot].to = v; edge[tot].cap = w; edge[tot].flow = 0;edge[tot].next = head[u]; head[u] = tot++;edge[tot].to = u; edge[tot].cap = 0; edge[tot].flow = 0;edge[tot].next = head[v]; head[v] = tot++;
}int Q[maxn];
int dep[maxn], cur[maxn], sta[maxn];bool bfs(int s, int t, int n)
{int front = 0, tail = 0;memset(dep, -1, sizeof(dep[0]) * (n+1));dep[s] = 0;Q[tail++] = s;while(front < tail){int u = Q[front++];for (int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if (edge[i].cap > edge[i].flow && dep[v] == -1){dep[v] = dep[u] + 1;if (v == t) return true;Q[tail++] = v;}}}return false;
}LL dinic(int s, int t, int n)
{LL maxflow = 0;while(bfs(s, t, n)){for (int i = 0; i < n; i++) cur[i] = head[i];int u = s, tail = 0;while(cur[s] != -1){if (u == t){int tp = inf;for (int i = tail-1; i >= 0; i--)tp = min(tp, edge[sta[i]].cap - edge[sta[i]].flow);//if (tp >= inf) return -1;maxflow += tp;for (int i = tail-1; i >= 0; i--){edge[sta[i]].flow += tp;edge[sta[i]^1].flow -= tp;if (edge[sta[i]].cap - edge[sta[i]].flow == 0) tail = i;}u = edge[sta[tail]^1].to;}else if (cur[u] != -1 && edge[cur[u]].cap > edge[cur[u]].flow&& dep[u]+1 == dep[edge[cur[u]].to]){sta[tail++] = cur[u];u = edge[cur[u]].to;}else{while(u != s && cur[u] == -1) u = edge[sta[--tail]^1].to;cur[u] = edge[cur[u]].next;}}}return maxflow;
}int n, m, A, B;
int S, T;
char a[maxn][maxn];int id(int i, int j) { return (i-1)*m + j; }int main()
{//FOPI;init();scanf("%d%d%d%d", &n, &m, &A, &B);S = 0, T = n*m+1;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){scanf(" %c", &a[i][j]);if (a[i][j] == '.') build(S, id(i, j), B);else build(id(i, j), T, B);if (i > 1) build(id(i, j), id(i-1, j), A);if (i < n) build(id(i, j), id(i+1, j), A);if (j > 1) build(id(i, j), id(i, j-1), A);if (j < m) build(id(i, j), id(i, j+1), A);}LL ans = dinic(S, T, T+1);printf("%lld\n", ans);
}

转载于:https://www.cnblogs.com/ruthank/p/10910559.html

Gym - 101128F Landscaping(网络流)相关推荐

  1. 网络流及建模专题(下)

    前言 不断更新中- 专题的(下)篇将介绍网络流的一些奇奇怪怪的应用和费用流有关的一些套路. 本专题暂时包含三道题: 洛谷P1251 餐巾计划问题: 费用流的基本应用 Trade Gym - 10021 ...

  2. I - Trade Gym - 100212I 网络流

    网络流好题 给出A.B两个点集,A.B之间有边相连,而A和B的内部均无边相连. 题目要求求出最多删除A.B之间的多少边,才能使得A中点的度数至少都为2,B中点的度数也至少都为2. 先求出每个点的度数, ...

  3. Gym - 101982E Cops And Robbers 网络流最小割

    1.题意: 输入一个n行m列的地图,地图上有k种陷阱底座,每种陷阱必须放在相应底座上,并且有一定的花费.有一只兔子初始位置在'B'处,为了使这只兔子不能逃出地图,必须放置一些陷阱来阻拦它.问怎么样放置 ...

  4. (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

    layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...

  5. Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)

    题目链接 (BZOJ) 大人,时代变了 (Gym) https://codeforces.com/gym/101190 (Luogu) https://www.luogu.com.cn/problem ...

  6. E - Flow Gym - 102471E

    E - Flow Gym - 102471E 题意: n个点,m条边,从点1到点n有k条相同长度的路径,每个边都有对应的容量,你可以进行任意次操作,每次将一个边的容量-1,将另一个边的容量+1,问最少 ...

  7. Magic Potion(最大流,跑两遍网络流或者加一个中转点)

    Magic Potion http://codeforces.com/gym/101981/attachments/download/7891/20182019-acmicpc-asia-nanjin ...

  8. D. Cross the Maze (网络流)

    题目 https://codeforces.com/gym/103427/problem/D 大意:给一个 a*b 的地图,有 n 个人和 n 个出口.出口只能用一次,人到了出口可以选择不出去.每次人 ...

  9. Gym 101845(2018 ACM-ICPC, Universidad Nacional de Colombia Programming Contest)

    Problem A Problem B 分析: 暴力查找,由操作111,我们可以知道原串的第一位可以匹配结果串的每一位,所以O(n)\mathcal{O}(n)O(n)枚举对齐判断就好:由操作222, ...

最新文章

  1. 在visual studio 2010中调用ffmpeg
  2. 写一个简单的爬虫 - 如何模拟登录网站
  3. vim中使用sed去除网上copy的源代码行号和空格
  4. 弹出硬盘时应用程序阻碍停用设备_7GB硬盘空间被Win 10“偷走”?微软系统的这些“潜规则”你掌握了吗?...
  5. Struts2中jsp page=xxx.action/jsp失效
  6. Flex 幻灯片播放
  7. 《精通J2EE网络编程》中讲的JNDI 6.1 什么是JNDI
  8. 线性查找法java代码_Java线性查找和二分查找
  9. 产生一定范围随机数的通用表达式
  10. 拓端tecdat|R语言进行数值模拟:模拟泊松回归模型的数据
  11. 范华专栏 | 投资中的统计陷阱
  12. 新手教程:采用AD9软件画原理图
  13. GAN学习记录(四)——条件生成对抗网络CGAN
  14. Eureka微服务之服务核心动作
  15. python100天从新手到大师下载_GitHub - chenqiyi/Python-100-Days: Python - 100天从新手到大师...
  16. 我是这样来做破解qq,做QQ外挂的 【-】
  17. CuteFTP 问题及 ftp 模式详解
  18. 今天分享一个Python游戏:简约飞机模拟器
  19. R语言学习笔记:使用reshape2包实现整合与重构
  20. scandir 参数

热门文章

  1. java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...
  2. java线性表合并_合并两个线性表
  3. vue读取外部配置文件
  4. Mybatis 查询返回List<String>集合
  5. Java创建Timestamp的几种方式
  6. VS2010怎样显示行号
  7. linux思科认证,思科CCIE认证知识点之IPv6地址
  8. 高评分防火墙GlassWire:帮你监控、追踪和提升电脑安全
  9. js打开新窗口的两种方式
  10. 安装deepin后会删除win10吗_不管是先装Win10还是先装Deepin,启动问题轻松搞定