https://www.luogu.org/problem/show?pid=3381

题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1:

4 5 4 3
4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5

输出样例#1:

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的时候记录路径最小流量

在给每条边减流量的时候新建反边即可

#include<cstdio>
#include<queue>
#define N 50010
using namespace std;
queue<int>q;
int n,m,tot;
int src,dec;
int to[N*2],from[N*2],nextt[N*2],front[N],cap[N*2],cost[N*2],dis[N],pre[N*2];
int minn[N];
bool v[N];
int sum_cost,sum_flow;
void add(int u,int v,int f,int w)
{to[++tot]=v;from[tot]=u;nextt[tot]=front[u];front[u]=tot;cap[tot]=f;cost[tot]=w;
}
bool spfa()
{for(int i=1;i<=n;i++) dis[i]=0x7fffffff,minn[i]=0x7fffffff;q.push(src);v[src]=true;dis[src]=0;while(!q.empty()){int now=q.front();q.pop();v[now]=false;for(int i=front[now];i;i=nextt[i]){if(dis[to[i]]>dis[now]+cost[i]&&cap[i]>0){dis[to[i]]=dis[now]+cost[i];minn[to[i]]=min(minn[now],cap[i]);pre[to[i]]=i;if(!v[to[i]]){q.push(to[i]);v[to[i]]=true;}}}}return dis[dec]!=0x7fffffff;
}
int main()
{scanf("%d%d%d%d",&n,&m,&src,&dec);int u,v,w,f;for(int i=1;i<=m;i++){scanf("%d%d%d%d",&u,&v,&w,&f);add(u,v,w,f);}while(spfa()){if(sum_cost+minn[dec]*dis[dec]>=0){sum_cost+=dis[dec]*minn[dec];sum_flow+=minn[dec];for(int i=pre[dec];i;i=pre[from[i]]) {cap[i]-=minn[dec];add(to[i],from[i],minn[dec],-cost[i]);}} else{sum_flow-=int(sum_cost/dis[dec]);break;}}printf("%d %d",sum_flow,sum_cost);
}

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/7223663.html

洛谷 3381 【模板】最小费用最大流相关推荐

  1. [SCOI2007]修车,洛谷P2053,最小费用最大流

    正题 给出m个师傅,n台车,并给出每个师傅各个车的时间,现在要使得,n辆车一起来,等待时间最短. 我们来观察一个师傅所消耗的等待时间.m个师傅所消耗的总等待时间就是车主的总等待时间. 对于第a个师傅, ...

  2. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  3. 洛谷4014最大/小费用最大流

    题目:https://www.luogu.org/problemnew/show/P4014 #include<iostream> #include<cstdio> #incl ...

  4. 洛谷 - P4043 [AHOI2014/JSOI2014]支线剧情(最小费用可行流)

    题目链接:点击查看 题目大意:给出一张 n 个点的有向图,每条边都有边权,现在要求将每条边至少遍历一遍,问最小的边权为多少 题目分析:建图时将每条边都设置流量为 [ 1 , inf ] ,就变成最小费 ...

  5. 洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n天每天所需要的新餐巾的数量,现在有多种方式可以获得新餐巾,问如何运营能使花费最少: 直接购买,花费为cost 将脏餐巾送到快洗部,需要洗t1天,花费为c1 将脏餐巾 ...

  6. 洛谷 - P4009 汽车加油行驶问题(分层图最短路/最小费用最大流)

    题目链接:点击查看 题目大意:给出一个n*n的矩阵表示道路,途中有一些加油站,现在要从点(1,1)到达点(n,n),问最小花费,其中的一些规则如下: 汽车只能沿着网格边行驶,装满油后可以行驶K条边,出 ...

  7. 洛谷 - P4016 负载平衡问题(最小费用最大流)

    题目链接:点击查看 题目大意:有n个仓库分布在一个环形的区域,现在每个仓库可以与相邻的两个仓库转移货物,问最少需要操作多少次才能让每个仓库的货物都达到平衡 题目分析:达到平衡的意思其实就是都等于平均值 ...

  8. 洛谷 P4016 负载平衡问题 【最小费用最大流】

    求出平均数sum,对于大于sum的点连接(s,i,a[i]-sum,0),表示这个点可以流出多余的部分,对于小于sum的点连接(i,t,sum-a[i],0)表示这个点可以接受少的部分,然后每个点向相 ...

  9. 洛谷 P2053 [SCOI2007]修车 网络流 最小费用最大流 Dinic+Spfa

    题目链接: https://www.luogu.com.cn/problem/P2053 思路参考博客: https://www.luogu.com.cn/blog/a23333/solution-p ...

  10. 洛谷P3980 志愿者招募——费用流

    洛谷P3980 [NOI2008]志愿者招募--费用流 题目介绍 题目描述 输入格式 输出格式 测试样例 题解 代码 题目介绍 题目描述 链接: 传送门. 申奥成功后,布布经过不懈努力,终于成为奥组委 ...

最新文章

  1. cocos2d-x的win32编译环境
  2. 【Python】机器学习绘图神器Matplotlib首秀!
  3. 为什么要将对象序列化
  4. Springboot第二篇:与前端fetch通信(附springboot解决跨域方法)
  5. Android中的一些基础知识(二)
  6. 报告PPT(123页):Python编程基础精要
  7. DBS-Function:f_GetPy
  8. Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解
  9. Laravel响应宏原理
  10. Linux快捷键详解
  11. matlab中散点图的线性拟合_matlab画散点图并拟合函数曲线MATLAB画散点图和二次函数...
  12. 微信html页面缓存问题,浅谈微信页面入口文件被缓存解决方案
  13. apk是什么意思以及apk里面有什么东西
  14. 鲁大师2023年Q1手机报告:ColorOS蝉联榜首
  15. 2072-歌手大奖赛
  16. mybatis的example
  17. 【TensorFlow】神经网络中间层截取、可视化中间层结果
  18. linux驱动之LCD驱动框架
  19. 应用线性代数简介 - 向量,矩阵和最小二乘法 By Stephen Boyd and Lieven Vandenberghe
  20. Minitab 21 功能列表

热门文章

  1. Windows 7 文件夹共享
  2. python下设置urllib连接超时
  3. 封送处理您的数据:利用 COM 和 Windows 2000 的高效传输数据的技术
  4. react学习(48)--编辑回显用moment处理
  5. 前端学习(2996):vue+element今日头条管理--代码测试规范
  6. 前端学习(2929):vue改变多个样式的组合
  7. [html] 如何给input的右上角加个清除的按钮?
  8. PS教程第十九课:移动工具
  9. [css] 相邻兄弟选择器、后代选择器和子选择器三者有什么区别?
  10. 工作260:js判断一个数组是否包含一个指定的值