题目链接:https://www.luogu.org/problemnew/show/P4012

洛谷 P4012 深海机器人问题

输入输出样例

输入样例#1:

1 1
2 2
1 2
3 4
5 6
7 2
8 10
9 3
2 0 0
2 2 2

输出样例#1:

42

说明

题解:建图方法如下:

  对于矩阵中的每个点,向东、向北分别与其相邻点都要连两条边(重边):

    1)容量为1,费用为该边价值的边;

    2)容量为INF,费用为0的边(因为多个深海机器人可以在同一时间占据同一位置)。

  对于每个起点:从S(源点)到这个点连:容量为该点机器人数,费用为0的边。

  对于每个终点:从这个点到T(汇点)连:容量为该点机器人数,费用为0的边。

代码:

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 const int N = 455;
  5 const int M = N*4+30;
  6 const int INF = 0x3f3f3f3f;
  7 struct Edge { int to,next,cap,flow,cost; }edge[M];
  8 int head[N],tol;
  9 int pre[N],dis[N];
 10 bool vis[N];
 11 int V;
 12 void init(int n) {
 13     V = n;
 14     tol = 0;
 15     memset(head,-1,sizeof(head));
 16 }
 17 void addedge(int u,int v,int cap,int cost) {
 18     edge[tol].to = v; edge[tol].cap = cap; edge[tol].cost = cost; edge[tol].flow = 0; edge[tol].next = head[u]; head[u] = tol++;
 19     edge[tol].to = u; edge[tol].cap = 0; edge[tol].cost = -cost; edge[tol].flow = 0; edge[tol].next = head[v]; head[v] = tol++;
 20 }
 21 bool spfa(int s,int t) {
 22     queue<int>q;
 23     for(int i = 0;i < V;i++) {
 24         dis[i] = INF;
 25         vis[i] = false;
 26         pre[i] = -1;
 27     }
 28     dis[s] = 0;
 29     vis[s] = true;
 30     q.push(s);
 31     while(!q.empty()) {
 32         int u = q.front();
 33         q.pop();
 34         vis[u] = false;
 35         for(int i = head[u]; i != -1;i = edge[i].next) {
 36             int v = edge[i].to;
 37             if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost ) {
 38                 dis[v] = dis[u] + edge[i].cost;
 39                 pre[v] = i;
 40                 if(!vis[v]) {
 41                     vis[v] = true;
 42                     q.push(v);
 43                 }
 44             }
 45         }
 46     }
 47     if(pre[t] == -1) return false;
 48     else return true;
 49 }
 50 int minCostMaxflow(int s,int t,int &cost) {
 51     int flow = 0;
 52     cost = 0;
 53     while(spfa(s,t)) {
 54         int Min = INF;
 55         for(int i = pre[t];i != -1;i = pre[edge[i^1].to]) {
 56             if(Min > edge[i].cap - edge[i].flow)
 57                 Min = edge[i].cap - edge[i].flow;
 58         }
 59         for(int i = pre[t];i != -1;i = pre[edge[i^1].to]) {
 60             edge[i].flow += Min;
 61             edge[i^1].flow -= Min;
 62             cost += edge[i].cost * Min;
 63         }
 64         flow += Min;
 65     }
 66     return flow;
 67 }
 68 int main() {
 69     int a, b, p, q, k, x, y, i, j, ans = 0;
 70     scanf("%d%d", &a, &b);//出发和目的地数目
 71     scanf("%d%d", &p, &q);
 72     init((p+1)*(q+1)+3);
 73
 74     int s = (p+1)*(q+1)+1, t = (p+1)*(q+1)+2;
 75
 76     for(i = 0; i <= p; ++i) {//p+1行,向东移动
 77         for(j = 0; j < q; ++j) {
 78             scanf("%d", &x);//边上的标本价值
 79             addedge(i*(q+1)+j, i*(q+1)+j+1, 1, -x);
 80             addedge(i*(q+1)+j, i*(q+1)+j+1, INF, 0);
 81         }
 82     }
 83     for(j = 0; j <= q; ++j) {//q+1列,向北移动
 84         for(i = 0; i < p; ++i) {
 85             scanf("%d", &x);
 86             addedge(i*(q+1)+j, i*(q+1)+j+q+1, 1, -x);
 87             addedge(i*(q+1)+j, i*(q+1)+j+q+1, INF, 0);
 88         }
 89     }
 90     for(i = 1; i <= a; ++i) {//起点
 91         scanf("%d%d%d", &k, &x, &y);
 92         addedge(s, x*(q+1)+y, k, 0);
 93     }
 94     for(i = 1; i <= b; ++i) {//终点
 95         scanf("%d%d%d", &k, &x, &y);
 96         addedge(x*(q+1)+y, t, k, 0);
 97     }
 98     minCostMaxflow(s, t, ans);
 99     printf("%d\n", -ans);
100     return 0;
101 }

View Code

转载于:https://www.cnblogs.com/GraceSkyer/p/9038586.html

洛谷 P4012 深海机器人问题【费用流】相关推荐

  1. 洛谷 - P4012 深海机器人问题(最大费用最大流)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,共有(n+1)*(m+1)条边,每条边都有一个权值,现在给出a个起点以及b个终点,问从怎样设计路线能让起点到终点的权值和最大,注意每条边的权值至多计 ...

  2. [费用流]洛谷 P2053 修车(zkw费用流模版)

    题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...

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

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

  4. 洛谷 - P2763 试题库问题(最大流+路径打印)

    题目链接:点击查看 题目大意:给出n种试题类型,以及m种试题,现在需要出题,要求每种类型的题目必须满足相应的数目,问应该怎么设计方案 题目分析:一开始其实就建好了图,然后就在怀疑自己建图的正确性,因为 ...

  5. 洛谷 - P2765 魔术球问题(最大流+残余网络上的最大流+路径打印)

    题目链接:点击查看 题目大意:给出n个柱子,问若按照规则摆放,最多能放多少个球,规则如下: 每次只能在某根柱子的最上面放球 在同一根柱子中,任何2个相邻球的编号之和为完全平方数 并输出方案 题目分析: ...

  6. 洛谷 P2071 座位安排 (最大流 + 建图)

    2020.7.15 今天先开个小差,这图书馆接近零下的气温给爷冻傻了,这还咋写题?马上回去了,练一练网络和tarjan吧. 这道题很简单,问有2n个人,n排座位,每个人都有喜欢的两个座位,最多能安置多 ...

  7. 洛谷网 1126机器人搬重物 优先队列搜索 一般

    点击打开题目 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可 ...

  8. [洛谷P4722]【模板】最大流 加强版 / 预流推进

    会$TLE$... C++ Code:(HLPP) #pragma GCC optimize(3) #pragma GCC optimize("unroll-loops") #in ...

  9. 洛谷P1402 酒店之王--网络流最大流拆点

    题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...

最新文章

  1. 树莓派视觉小车 -- 人脸追踪(人脸识别、PID控制舵机运动)
  2. 1.1 Java异常(Exception)处理及常见异常
  3. EXCEL 中找出两个sheet相同列
  4. Android studio 混淆打包 proguard-rules.pro 与 bulid.gradle 配置总结
  5. progressIndicator in SalesPipeline
  6. LeetCode算法入门- Roman to Integer Integer to Roman -day8
  7. python语句分为复合语句与_对Python中for复合语句的使用示例讲解
  8. 绝对干货:供个人开发者赚钱免费使用的一些好的API接口
  9. 【漫画】兔子,胡萝卜和屎
  10. 《神探tcpdump第八招》-linux命令五分钟系列之四十二
  11. Xshell Xftp 免费版申请 官方正版 | 无需破解
  12. bios 微星click_微星主板CLICK BIOS II BIOS设置软件
  13. 只要还在路上前行着的,那都是一个个闪闪发光惹人爱的人啊
  14. mac编译linux开源软件,Mac 端超好用的免费开源软件,我推荐这几款
  15. 博弈论学习笔记——拍卖原理
  16. curl命令查询IP和运营商
  17. 花瓣图片采集工具研究
  18. Unity【Bounds Vector3 Cross】- 如何判断一个物体是否在一个凸边体三维区域内
  19. JAVA获取百度网盘下载真实地址
  20. 支付宝面试:说说序列和反序列?

热门文章

  1. vue.js根据数据循环生成表格_vue.js循环for(列表渲染)详解
  2. 命名空间不能直接包含字段或方法之类的成员是什么意思_Python 学习笔记之类与实例...
  3. 控制台资费管理主菜单java_java毕业设计_springboot框架的高速公路收费管理系统...
  4. 关闭运动轨迹_网球初学者如何正确入门网球运动,有哪些学习细节
  5. java i o总结_Java I/O 总结
  6. 九齐51单片机使用注意事项:不要用float
  7. c#endread怎么打印出来_打印机打印出来是白板是怎么回事
  8. 形态学操作——击中击不中变换
  9. scala中何时使用下划线_在Scala中使用下划线
  10. tolowercase_Java String toLowerCase()方法与示例