题目链接:http://codevs.cn/problem/1917/

这题输入好恶心啊,看了半天看不懂。

给一个地图,给出一些路径,这路径上的宝藏有价值。宝藏只能拿一次。

再给出机器人起始位置,终点位置。终点位置不唯一且每一个终点只能允许有限个机器人到达,起点则不止一个机器人。

问机器人收集到的最大价值。

每一个点的宝藏只能拿一次,但是可以走无限次。那么可以建两条边,一条边的容量为1花费为-w,另一条则容量inf花费为0。这就保证只有一个会获得宝藏。

关于机器人起点和终点:

超级源链接所有机器人起点,流量为当前点机器人数,花费为0。同理终点连向超级汇。

这题精髓之处就是在于如何确定每一个点保证仅拿一次了。

上题拆点,这题拆边。有点意思。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 typedef long long LL;
  5 typedef struct Node {
  6     int u, v, next;
  7     LL c, w;
  8 }Node;
  9 const int maxn = 6666;
 10 const int maxm = 66666;
 11 const LL mod = 0x3f3f3f3fLL;
 12 const LL inf = (1LL<<55);
 13 int tot, head[maxn];
 14 LL dist[maxn];
 15 LL cost, flow;
 16 Node e[maxm];
 17 int pre[maxn];
 18 bool visit[maxn];
 19 queue<int> Q;
 20 int S, T, N;
 21
 22 void init() {
 23     S = T = N = 0;
 24     memset(head, -1, sizeof(head));
 25     tot = 0;
 26 }
 27
 28 void adde(int u, int v, LL c, LL w) {
 29     e[tot].u = u; e[tot].v = v; e[tot].c = c; e[tot].w = w; e[tot].next = head[u]; head[u] = tot++;
 30     e[tot].u = v; e[tot].v = u; e[tot].c = 0; e[tot].w = -w; e[tot].next = head[v]; head[v] = tot++;
 31 }
 32 bool spfa(int s, int t, int n) {
 33     int i;
 34     for(i = 0; i <= n; i++) {
 35         dist[i] = inf;
 36         visit[i] = 0;
 37         pre[i] = -1;
 38     }
 39     while(!Q.empty()) Q.pop();
 40     Q.push(s);
 41     visit[s] = true;
 42     dist[s] = 0;
 43     pre[s] = -1;
 44     while(!Q.empty()) {
 45         int u = Q.front();
 46         visit[u] = false;
 47         Q.pop();
 48         for(int j = head[u]; j != -1; j = e[j].next) {
 49             if(e[j].c > 0 && dist[u] + e[j].w < dist[e[j].v]) {
 50                 dist[e[j].v] = dist[u] + e[j].w;
 51                 pre[e[j].v] = j;
 52                 if(!visit[e[j].v]) {
 53                     Q.push(e[j].v);
 54                     visit[e[j].v] = true;
 55                 }
 56             }
 57         }
 58     }
 59     if(dist[t] == inf) return false;
 60     else return true;
 61 }
 62 LL ChangeFlow(int t) {
 63     LL det = mod;
 64     int u = t;
 65     while(~pre[u]) {
 66         u = pre[u];
 67         det = min(det, e[u].c);
 68         u = e[u].u;
 69     }
 70     u = t;
 71     while(~pre[u]) {
 72         u = pre[u];
 73         e[u].c -= det;
 74         e[u ^ 1].c += det;
 75         u = e[u].u;
 76     }
 77     return det;
 78 }
 79 LL MinCostFlow(int s, int t, int n) {
 80     LL mincost, maxflow;
 81     mincost = maxflow = 0;
 82     while(spfa(s, t, n)) {
 83         LL det = ChangeFlow(t);
 84         mincost += det * dist[t];
 85         maxflow += det;
 86     }
 87     cost = mincost;
 88     flow = maxflow;
 89     return mincost;
 90 }
 91
 92 int a, b, p, q;
 93 int k, x, y, w;
 94
 95 int main() {
 96     init();
 97     scanf("%d%d%d%d",&a,&b,&p,&q);
 98     p++; q++;
 99     S = 0, T = p * q + 1, N = p * q + 2;
100     for(int i = 0; i < p; i++) {
101         for(int j = 1; j < q; j++) {
102             scanf("%d", &w);
103             adde(i*q+j, i*q+j+1, 1, -w);
104             adde(i*q+j, i*q+j+1, inf, 0);
105         }
106     }
107     for(int j = 1; j <= q; j++) {
108         for(int i = 0; i < p - 1; i++) {
109             scanf("%d", &w);
110             adde(i*q+j, (i+1)*q+j, 1, -w);
111             adde(i*q+j, (i+1)*q+j, inf, 0);
112         }
113     }
114     for(int i = 0; i < a; i++) {
115         scanf("%d%d%d",&k,&x,&y);
116         adde(S, x*q+y+1, k, 0);
117     }
118     for(int i = 0; i < b; i++) {
119         scanf("%d%d%d",&k,&x,&y);
120         adde(x*q+y+1, T, k, 0);
121     }
122     printf("%lld\n", -MinCostFlow(S, T, N));
123     return 0;
124 }

转载于:https://www.cnblogs.com/kirai/p/6768820.html

[codeVS1917] 深海机器人问题(费用流,拆边)相关推荐

  1. 【图论】【网络流】费用流模型

    费用流模型 费用流板子 费用流直接应用 运输问题 负载平衡问题 二分图最大匹配 分配问题 最大权不相交路径 数字梯形问题 费用流网格图模型 K取方格数 深海机器人问题 费用流拆点 餐巾计划问题 费用流 ...

  2. H - Transportation(费用流)

    H - Transportation(费用流) 拆边思想. c o s t = k × f l o w 2 cost=k\times flow^2 cost=k×flow2 因为 f l o w ≤ ...

  3. 洛谷 P4012 深海机器人问题【费用流】

    题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...

  4. 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]

    题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai​现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi​,现在设 D ...

  5. 【BZOJ2245】[SDOI2011]工作安排 拆边费用流

    [BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...

  6. [洛谷P4012] [网络流24题] 深海机器人问题

    Description 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生 ...

  7. 【bzoj2245】[SDOI2011]工作安排 费用流

    题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...

  8. 【bzoj3442】学习小组 费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6809670.html 题目描述 [背景] 坑校准备鼓励学生参加学习小组. [描述] 共有n个学生,m个学习小组,每个 ...

  9. [BZOJ 1221][HNOI2001]软件开发(费用流)

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  10. UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)

    题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...

最新文章

  1. SAP软件项目实施要点
  2. Taro+react开发(87):图片引入
  3. hive2 mysql_架构hive2mysql流程
  4. 004商城项目:ssm框架的整合之后的调试
  5. 智慧公厕管理系统不断提升公厕管理水平
  6. java怎么遵循ws规范,WS-BPEL语言基础
  7. 读《有效管理的5大兵法》笔记摘录(一)核心价值观:求实、进取、创新、协同、分享
  8. spring源码解析,vip视频解析源码
  9. 快解析教你,快速注册个人域名
  10. 联想笔记本声音太小怎么办_笔记本声音太小,小编告诉你笔记本电脑声音太小解决方法...
  11. 微信小程序格式化数字在插值语法里面使用
  12. 10a大电流稳压芯片_高压dc48v降12v10a大电流降压ic详解
  13. Python 画玫瑰,程序员也有春天
  14. 哥白尼气候数据ERA5数据集——大气数据研究
  15. Linux知识入门(一)
  16. CTU 2017 B - Pond Cascade 二分
  17. 电销公司用什么外呼系统好?用pc版还是app版
  18. GAL汉化界的一点实话。。。。。
  19. 阿旭机器学习实战【2】KNN算法进行人体动作识别
  20. C语言局域网对战游戏,局域网聊天的程序(C++版)

热门文章

  1. MySql Binlog初识
  2. 转:面试题收集——Java基础部分(一)
  3. struts2--Basic(一)
  4. 个人工作总结(第一阶段)
  5. 如何查询SID及根据SID反查对应的账户
  6. Design Patterns(二十四):Visite Pattern--VB代码
  7. 推荐系统--收藏起来慢慢研究
  8. html div自动撑起来,解决子级用css float浮动 而父级div没高度不能自适应高度
  9. mysql 主主_MySQL双主(主主)架构
  10. CreateInstance 方法解析