P3381 【模板】最小费用最大流

题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。

输入格式 第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。

接下来M行每行包含四个正整数ui、vi、wi、fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi。

输出格式 一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用。

输入输出样例

  1. 输入 #1 复制
  2. 4 5 4 3
  3. 4 2 30 2
  4. 4 3 20 3
  5. 2 3 20 1
  6. 2 1 30 9
  7. 1 3 40 5
  8. 输出 #1 复制
  9. 50 280

说明/提示 时空限制:1000ms,128M

(BYX:最后两个点改成了1200ms)

数据规模:

对于30%的数据:N<=10,M<=10

对于70%的数据:N<=1000,M<=1000

对于100%的数据:N<=5000,M<=50000

样例说明:

如图,最优方案如下:

第一条流为4–>3,流量为20,费用为3*20=60。

第二条流为4–>2–>3,流量为20,费用为(2+1)*20=60。

第三条流为4–>2–>1–>3,流量为10,费用为(2+9+5)*10=160。

故最大流量为50,在此状况下最小费用为60+60+160=280。

故输出50 280。

思路

Spfa + Dinic

题解如下

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. #define INF 0x3f3f3f3f
  7. #define ll long long
  8. const int maxn = 5005;
  9. const int maxm = 150000;
  10. int n, m, s, e;
  11. struct Edge
  12. {
  13. int v, w, cap, next;
  14. } edge[maxm];
  15. int head[maxn], dis[maxn], use[maxn];
  16. int pre[maxn], last[maxm]; //pre 是用来存储上一个节点的, 而last 则是存储上一个边
  17. int flow[maxn];
  18. int k = -1;
  19. ll mx_flw = 0, mn_cst = 0;
  20. void Add(int u, int v, int w, int cap)
  21. {
  22. edge[++ k] = (Edge){ v, w, cap, head[u]}; head[u] = k;
  23. edge[++ k] = (Edge){ u, -w, 0, head[v]}; head[v] = k;
  24. }
  25. bool Spfa(int s, int e)
  26. {
  27. int ar[10];
  28. for(int i = 0; i <= n; i ++)
  29. dis[i] = INF, use[i] = 0, flow[i] = INF;
  30. dis[s] = 0;
  31. queue<int> q;
  32. q.push(s);
  33. int u,v,w;
  34. while(! q.empty())
  35. {
  36. u = q.front(); q.pop();
  37. use[u] = 0;
  38. for(int i = head[u]; i != -1; i = edge[i].next)
  39. {
  40. v = edge[i].v;
  41. w = edge[i].w;
  42. if(edge[i].cap && dis[v] > dis[u] + w)
  43. {
  44. dis[v] = dis[u] + w;
  45. pre[v] = u;
  46. last[v] = i;
  47. flow[v] = min(flow[u], edge[i].cap);
  48. if(! use[v])
  49. {
  50. q.push(v);
  51. use[v] = 1;
  52. }
  53. }
  54. }
  55. }
  56. if(flow[e] != INF)
  57. return true;
  58. return false;
  59. }
  60. void MCMF(int s, int e)
  61. {
  62. while(Spfa(s, e))
  63. {
  64. mx_flw += flow[e];
  65. mn_cst += flow[e]*1LL * dis[e]*1LL;
  66. int now = e;
  67. while(now != s) //更新 残量
  68. {
  69. edge[last[now]].cap -= flow[e];
  70. edge[last[now]^1].cap += flow[e];
  71. now = pre[now];
  72. }
  73. }
  74. }
  75. void init()
  76. {
  77. k = -1;
  78. for(int i = 0; i <= n; i ++)
  79. head[i] = -1;
  80. mx_flw = 0, mn_cst = 0;
  81. }
  82. int main()
  83. {
  84. ios::sync_with_stdio(false); cin.tie(0);
  85. //freopen("T.txt","r",stdin);
  86. while(cin >> n >> m >> s >> e)
  87. {
  88. init();
  89. int u, v, cap, w;
  90. for(int i = 1; i <= m; i ++)
  91. cin >> u >> v >> cap >> w, Add(u, v, w, cap);
  92. MCMF(s, e);
  93. cout << mx_flw << " " << mn_cst << endl;
  94. }
  95. return 0;
  96. }

P3381 【模板】最小费用最大流(MCMF)的更多相关文章

  1. P3381 [模板] 最小费用最大流

    EK  + dijkstra (2246ms) 开氧气(586ms) dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381 ...

  2. 把人都送到房子里的最小花费--最小费用最大流MCMF

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=1533 相邻的容量为inf,费用为1,S到m容量为1,费用为0 ,H到T容量为1,费用为0. 建图跑-最小费 ...

  3. POJ 2195 - Going Home - [最小费用最大流][MCMF模板]

    题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS Memory Limit: 65536K Description On a grid ma ...

  4. 【洛谷 p3381】模板-最小费用最大流(图论)

    题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解法:在Dinic的基础下做spfa算法. 1 #include<cst ...

  5. 网络流--最小费用最大流MCMF模板

    标准大白书式模板 #include<stdio.h> //大概这么多头文件昂 #include<string.h> #include<vector> #includ ...

  6. 洛谷P3381 (最小费用最大流模板)

    记得把数组开大一点,不然就RE了... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 ...

  7. 洛谷.3381.[模板]最小费用最大流(zkw)

    题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...

  8. POJ-2516(最小费用最大流+MCMF算法)

    Minimum Cost POJ-2516 题意就是有n个商家,有m个供货商,然后有k种商品,题目求的是满足商家的最小花费供货方式. 对于每个种类的商品k,建立一个超级源点和一个超级汇点.每个商家和源 ...

  9. POJ-2195(最小费用最大流+MCMF算法)

    Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1, ...

  10. 最小费用最大流MCMF 最小增广

    没有写单纯性的...应该不会有卡最小增广的出题人吧...(雾) struct MCMF{ struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms, ...

随机推荐

  1. 论JS函数传参时:值传递与引用传递的区别

    什么是值传递:值传递是指在调用函数时将实际参数(实参)复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 值传递的总结:也就是说,将实参复制到函数中的这个过程叫值传递 什么是 ...

  2. JavaScript对象(二)

    Part One:对象的三个特性 原型(prototype)  类(class) 可扩展性(extensible attribute) 1,b.isPrototypeOf(o)  //判断b是不是o的 ...

  3. JS中面向对象中的继承(常用写法)---核心部分

    1.基本概念 子类继承父类,但是不能影响父类.包括1.混合继承(构造函数+原型) 2.ES6新增class的继承. 接下来介绍,面向对象中继承的两种常用写法.即混合继承(构造函数+原型)和class继 ...

  4. 看完这篇 HTTPS,和面试官扯皮就没问题了

    下面我们来一起学习一下 HTTPS ,首先问你一个问题,为什么有了 HTTP 之后,还需要有 HTTPS ?我突然有个想法,为什么我们面试的时候需要回答标准答案呢?为什么我们不说出我们自己的想法和见解 ...

  5. scrapy-redis分布式爬取知乎问答,使用docker布置多台机器。

    先上结果: 问题: 答案: 可以看到现在答案文档有十万多,十万个为什么~hh 正文开始: 分布式爬虫应该是在多台服务器(A B C服务器)布置爬虫环境,让它们重复交叉爬取,这样的话需要用到状态管理器. ...

  6. Simulink仿真入门到精通(十六) Simulink基于模型设计的工业应用概述

    16.1 Simulink用途概述 在基于模型设计广泛应用于汽车电子嵌入式开发的今天,MBD(Model Besed Design)技术也逐步推广到各种嵌入式控制方面.与传统的嵌入式开发相比,BMD以 ...

  7. 用shell脚本实现定时备份数据库

    1.备份数据库的方法 可以使用命令查看 ls  /usr/local/mysql/bin 这个mysqldump就是系统内置的用来备份数据库的工具. 2.实现方法 ①先随便进入一个位置创建一个目录 ② ...

  8. Vue2.0 【第二季】第7节 Component 组件 props 属性设置

    目录 Vue2.0 [第二季]第7节 Component 组件 props 属性设置 第7节 Component 组件 props 属性设置 一.定义属性并获取属性值 二.属性中带' - '的处理方式 ...

  9. python基础学习day02

    pycharm的安装以及简单使用 辅助开发软件,代码逐行调试,设计高端 python的种类: ​ CPython:官方推荐可以转换成c能够识别的字节码. ​ JPython:可以转化为Java语言能够 ...

  10. 一些http知识

    一些http知识 前置知识 首先放一张非常经典的计算机网络 关于五层结构 「物理层」「数据链路层」「网络层」「运输层」「应用层」我们依次来讲 我们拿wireshark 抓个http包看一下就能明白各层 ...