题目描述

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

题目链接


思路

最大流是没有问题的,关键是同时保证最小费用,因此,就可以把每条边的费用视为距离,每次增广时用spfa代替bfs选取最小费用的增广路,这样跑一遍EK就可以了

据听说有神仙用dij跑最小费用最大流。。。可是我太弱了

犯的一些小问题:建反向边建错了两次(一次u、v写反,一次w忘取0)qwq

code

#include<bits/stdc++.h>
#define fex for(int i=head[x];i!=-1;i=edge[i].next)
using namespace std;
const int MAXN=5e5+5,INF=0x3f3f3f3f;
struct node{
int to,cost,w,next;
}edge[MAXN];
int cnt=-1,n,m,minc,maxf,s,t;
int pre[MAXN],from[MAXN],head[MAXN],dist[MAXN],nf[MAXN];
bool _in[MAXN];
queue<int > q; void addedge(int from,int to,int w,int cost)
{
edge[++cnt].cost=cost;
edge[cnt].next=head[from];
edge[cnt].to=to;
edge[cnt].w=w;
head[from]=cnt;
} bool spfa()
{
memset(dist,INF,sizeof(dist)),memset(_in,0,sizeof(_in));
while(!q.empty()){
q.pop();
}
q.push(s);
dist[s]=0,_in[s]=1,nf[s]=INF;
while(!q.empty()){
int x=q.front();
// cout<<x<<"spfa\n";
q.pop();
_in[x]=0;
fex{
int y=edge[i].to;
if(edge[i].w>0&&edge[i].cost+dist[x]<dist[y]){
dist[y]=dist[x]+edge[i].cost;
nf[y]=min(nf[x],edge[i].w);
from[y]=x;
pre[y]=i;
if(!_in[y]){
_in[y]=1;
q.push(y);
}
}
}
}
return dist[t]!=INF;
} void EK()
{
while(spfa()){
int x=t;
// puts("EK");
while(x!=s){
int y=from[x],i=pre[x];
edge[i].w-=nf[t];
edge[i^1].w+=nf[t];
x=y;
}
maxf+=nf[t];
minc+=dist[t]*nf[t];
}
} int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
memset(head,-1,sizeof(head));
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
int u,v,w,f;
cin>>u>>v>>w>>f;
addedge(u,v,w,f);
addedge(v,u,0,-f);
}
EK();
cout<<maxf<<' '<<minc<<endl;
return 0;
}

参考资料

最小费用最大流 学习笔记&&Luogu P3381 【模板】最小费用最大流的更多相关文章

  1. Dynamic CRM 2013学习笔记(二十一)自定义审批流2 - 配置按钮

    上次介绍了 Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示 现在开始介绍如何配置审批流,首先在form上添加三个按钮,Submit, Agree, Reject: 1. ...

  2. Dynamic CRM 2013学习笔记(三十七)自定义审批流7 - 初始化(整套审批流下载、安装)

    前面介绍了自定义审批流的配置.使用,这篇介绍下如何进行初始化. 一. 下载 从下面的地址下载整个审批流: http://yunpan.cn/cZ5Rdx5HCt3VF 下载完后,一共有三块内容: 二. ...

  3. 微信小程序开发:学习笔记[2]——WXML模板

    微信小程序开发:学习笔记[2]——WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建 ...

  4. Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示

    CRM的项目,审批流是一个必须品.为了更方便灵活地使用.配置审批流,我们自定义了一整套审批流.首先来看下它的效果: 1. 审批模板 这是一个最简单的审批流,首先指定审批实体,及相关字段,再配置流程节点 ...

  5. Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理

    上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...

  6. IO流学习笔记(二)之BufferedWriter与BufferedReader及实例Demo

    在之前的学习笔记(http://blog.csdn.net/megustas_jjc/article/details/72853059)中,FileWriter与FileReader的Demo使用的中 ...

  7. JAVA.IO流学习笔记

    一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...

  8. Luogu P3381 (模板题) 最小费用最大流

    <题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...

  9. zkw费用流 学习笔记

    分析 记\(D_i\)为从\(S\)出发到\(i\)的最短路 最短路算法保证, 算法结束时 对于任意存在弧\((i,j)\)满足\(D_i + c_{ij}\ge D_j\) ① 且对于每个 \(j\ ...

随机推荐

  1. MySQL select from where multiple conditions

    Maybe one of the most used MySQL commands is SELECT, that is the way to stract the information from ...

  2. C++入门到理解阶段二基础篇(2)——C++注释、变量、常量、关键字、标识符

    目录 1.注释 注释作用 注释的方式 2.变量 变量基本知识 定义变量 3.常量 常量基本知识 整数常量 浮点常量 布尔常量 字符常量 字符串常量 常量定义 使用 #define 预处理器. 使用 c ...

  3. UTF-8和BOM的一些说明

    BOM的含义 BOM即Byte Order Mark字节序标记.BOM是为UTF-16和UTF-32准备的,用户标记字节序(byte order).拿UTF-16来举例,其是以两个字节为编码单元,在解 ...

  4. jemalloc内存占用问题

    最近,有部分越南的服务器内存不断上涨,怀疑是内存泄漏,因为框架提供的内存报告里,C内存和Lua占用内存都不大,和ps里看的差好多.总内存在12G左右,C和Lua的加起来约4G,两者相差了8G 经过一番 ...

  5. WebService 接收JSON字符串

    晚上学习时公司的同事,暂且叫A吧,A:“我们公司XXX纺织的AM接口不通,让我看下”,我:“接口写的不是有AJAX异步请求的示例嘛,参考下,我都测试过接口,都是通的.”,A:“我走的不是AJAX,走的 ...

  6. SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了?

    SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了? 正确答案是: 不允许,这是SAP标准逻辑. 那么问题来了!今日收到业务人员报说采购订单4300013979,完成了收货和IV, ...

  7. Swift 字典模型互转总结

    现在很多iOS项目的开发开始转向Swift语言. 相信 Swift语言很快会成为iOS工程师 必备技能. 字典转模型, 模型转转字典在开发过程中扮演非常重要的角色. 今天就和大家分享一下使用Swift ...

  8. Android SDK自带调试优化工具

    Android sdk中自带了一些分析内存,界面调优的非常实用的工具,这对于分析和调试我们的应用十分有帮助,由于我使用的是linux版本的sdk,所以就以linux版本的工具做一个介绍,这些工具的具体 ...

  9. Mybatis书写

    Mybatis设置主键和自增 方法1: <insert id="insert" parameterType="Person" useGeneratedKe ...

  10. 原生js利用data选择元素

    //js var a = document.querySelector('[data-word=a]') console.log(a) html <dl class="find-car ...