最小费用最大流 学习笔记&&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\ ...
随机推荐
- python3的ExecJS安装使用
参考官方文档安装 pip3 install PyExecJS 代码编写 import execjs ctx = execjs.compile(""" function a ...
- Codeforces Round #594 (Div. 1) A. Ivan the Fool and the Probability Theory 动态规划
A. Ivan the Fool and the Probability Theory Recently Ivan the Fool decided to become smarter and stu ...
- Note | 常用指令,工具,教程和经验笔记
目录 图像处理 机器学习和数学 编程环境和工具 写作工具 其他 图像处理 获取图像频域并分解为高低频:https://www.cnblogs.com/RyanXing/p/11630493.html ...
- python--基础知识点梳理(之数据结构)
数据结构: # 按逻辑结构(面向问题)分为:集合结构.线性结构.树形结构.图形结构 # 按物理结构(面向计算机)分为: # 顺序存储结构(把数据元素放在地址连续的存储单元中,数据间的逻辑关系和物理关系 ...
- WPF 解决多个TreeViewItem同时触发某事件的简单方法
原理是: 因为是双击事件,也就是同时引发了选择事件,TreeViewItem的IsSelected为True.通过触发器设置某个属性为特殊值,然后在CS页面的双击事件方法内判断是否此值即可. xaml ...
- C#WinForm解决跨线程访问控件属性报错
方式一(在程序初始化构造函数中加一行代码): public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCal ...
- git 配置远程仓库(同一个邮箱注册多个gitlab仓库)
之前配置的全局用户和邮箱,如果是多个注册账户就不能设置为全局账户 git config --global user.name "username" git config --glo ...
- JS实现深浅拷贝
1.实现浅拷贝 // 1. ...实现 let copy1 = {...{x:1}} // 2. Object.assign实现 let copy2 = Object.assign({}, {x:1} ...
- ListView详细介绍与使用
前言介绍: 关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注意的地方,还有日常开发过程中 ...
- [日常] 前端资源测试机上忽略版本号的的nginx配置
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向).permanent(永久重定向).break和last.其中前 ...