最小费用最大流 学习笔记&&Luogu P3381 【模板】最小费用最大流
题目描述
给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。
思路
最大流是没有问题的,关键是同时保证最小费用,因此,就可以把每条边的费用视为距离,每次增广时用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 【模板】最小费用最大流的更多相关文章
- Dynamic CRM 2013学习笔记(二十一)自定义审批流2 - 配置按钮
上次介绍了 Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示 现在开始介绍如何配置审批流,首先在form上添加三个按钮,Submit, Agree, Reject: 1. ...
- Dynamic CRM 2013学习笔记(三十七)自定义审批流7 - 初始化(整套审批流下载、安装)
前面介绍了自定义审批流的配置.使用,这篇介绍下如何进行初始化. 一. 下载 从下面的地址下载整个审批流: http://yunpan.cn/cZ5Rdx5HCt3VF 下载完后,一共有三块内容: 二. ...
- 微信小程序开发:学习笔记[2]——WXML模板
微信小程序开发:学习笔记[2]——WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建 ...
- Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示
CRM的项目,审批流是一个必须品.为了更方便灵活地使用.配置审批流,我们自定义了一整套审批流.首先来看下它的效果: 1. 审批模板 这是一个最简单的审批流,首先指定审批实体,及相关字段,再配置流程节点 ...
- Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理
上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...
- IO流学习笔记(二)之BufferedWriter与BufferedReader及实例Demo
在之前的学习笔记(http://blog.csdn.net/megustas_jjc/article/details/72853059)中,FileWriter与FileReader的Demo使用的中 ...
- JAVA.IO流学习笔记
一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...
- Luogu P3381 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
- zkw费用流 学习笔记
分析 记\(D_i\)为从\(S\)出发到\(i\)的最短路 最短路算法保证, 算法结束时 对于任意存在弧\((i,j)\)满足\(D_i + c_{ij}\ge D_j\) ① 且对于每个 \(j\ ...
随机推荐
- 数位DP入门详解+题目推荐
\(update:2019-9-6\) 博客里某些东西没有解释清楚,完善了对应的解释 在开始之前,我们先来看一道题--题目链接 题目要求,相邻两位的差大于等于2,那么我们先来构造一个试一试. 比如说\ ...
- JS 从内存空间谈到垃圾回收机制
壹 ❀ 引 从事计算机相关技术工作的同学,对于内存空间相关概念多少有所耳闻,毕竟像我这种非计算机科班出身的人,对于栈堆,垃圾回收都能简单说道几句:当我明白JS 基本类型与引用类型数据存储方式不同,才 ...
- selenium三大切换的骚操作之显性等待
一.handle窗口切换 当点击某个元素后,会重新生成一个新的页签,但此时我们的操作仍然在原先的窗口当中,如果要在新的窗口继续操作元素,那么就要用到handle窗口切换的方法. 常用方法: windo ...
- 使用XShell工具 linux 常用命令
- 框架基础:深入理解Java注解类型(@Annotation)
注解的概念 注解的官方定义 首先看看官方对注解的描述: An annotation is a form of metadata, that can be added to Java source co ...
- Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...
- 官宣:腾讯WeTest明星工具-PerfDog面向全球发布!
导读 PerfDog(官网:perfdog.qq.com)作为移动全平台性能测试分析专业工具,在腾讯内部研发测试工具商店-WeTest Store上线后服务了近2000+名开发者,其中<王者荣耀 ...
- UIAlertView和UIAlertController
UIAlertView 随着苹果上次iOS 5的发布,对话框视图样式出现在了我们面前,直到现在它都没有发生过很大的变化.下面的代码片段展示了如何初始化和显示一个带有“取消”和“好的”按钮的对话框视图. ...
- ABP进阶教程2 - 组合查询
点这里进入ABP进阶教程目录 更新数据传输对象 打开应用层(即JD.CRS.Application)的Course\Dto\GetAllCoursesInput.cs //Course数据传输对象(查 ...
- java中字符串String、StringBuilder、StringBuffer的常用方法
String的常用方法: public static void main(String[] args) { String str = "Hello world!"; // 获取字符 ...