zkw费用流 学习笔记
分析
记\(D_i\)为从\(S\)出发到\(i\)的最短路
最短路算法保证, 算法结束时
对于任意存在弧\((i,j)\)满足\(D_i + c_{ij}\ge D_j\) ①
且对于每个 \(j\) 至少存在一个 \(i\) 使得等号成立 ②
算法结束后, 恰在最短路上的边满足 \(D_j = D_i + c_{ij}\)
在最小费用流的计算中,我们每次沿 \(D_j = D_i + c_{ij}\)的路径增广
增广会让流量减小,会让部分的弧变得没有流量(即暂时不存在了)
是不会破坏①,但可能会破坏②的
这可能使我们找不到每条边都满足 $ D_j = D_i + c_{ij}$ 新的增广路
普通费用流的方法是:每次增广再使用 SPFA等方法重新计算\(D\)
这无疑是一种浪费
做法
\(D_i + c_{ij}\ge D_j~\Leftrightarrow~D_i-D_j+c_{ij}\ge 0~~\)①
\(D_i + c_{ij}= D_j~\Leftrightarrow~D_i-D_j+c_{ij}= 0~~\)②
对于一个顶标\(D\),我们可以不断的dfs找\(D_i-D_j+c_{ij}=0\)的增广路经
假设我们当前dfs失败
即使失败还是有一些点能满足\(D_i-D_j+c_{ij}=0\)的
这些点被我们当前dfs到了
我们记这些点的点集为\(V\)
找到\(\Delta= \min\left\{D_i-D_j+c_{ij} \right\} ~|~~ i \in V, j \notin V, flow_{~ij} > 0\)
然后我们对\(~~\forall i\in V ,~~D_i^{\pi}=D_i-\Delta\)
条件①②均没有被破坏
证明:
弧\((i,j)\)可以分成四类,再根据当前dfs失败的条件,有:
i\in V,j\notin V &原来D_i-D_j+c_{ij} \ge \Delta> 0&新图 D_i^{\pi}-D_j+c_{ij}\ge 0\\
i\in V,j\in V &原来D_i-D_j+c_{ij} =0&新图 D_i^{\pi}-D_j^{\pi}+c_{ij}= 0\\
i\notin V,j\notin V &原来D_i-D_j+c_{ij}\ge 0&新图 D_i-D_j+c_{ij}\ge 0\\
i\notin V,j\in V &原来D_i-D_j+c_{ij} \ge 0&新图 D_i-D_j^{\pi}+c_{ij}\ge \Delta\\
\end{aligned}
\]
可以发现第一类弧中一定有至少一条满足
\(原来D_i-D_j+c_{ij}=\Delta~~~~~~~新图 D_i^{\pi}-D_j+c_{ij}=0\)的
即至少有一条新的边进入了 \(D_j = D_i + c_{ij}\) 的子图
可以发现一条增广路的流量为 -D[S]
实现
struct ZKW{
int flow,cost;
int D[M],V[M];
int aug(int x,int fl){
V[x]=1;
if(x==T) return cost+=-D[S]*fl, flow+=fl, fl;
int p,y,tp;
for(p=e(x);p;p=e[p].nxt)
if(e[p].f && !V[y=e[p].y] && D[x]+e[p].d-D[y]==0)
if(tp=aug(y,min(fl,e[p].f))) return e[p].f-=tp, e[p^1].f+=tp, tp;
return 0;
}
bool mdf(){
if(V[T]==1) return 1;
int i,x,y,z=INF;
for(i=2;i<=e.te;i++)
if(e[i].f&&V[x=e[i^1].y]&&!V[y=e[i].y]) z=min(z,D[x]+e[i].d-D[y]);
if(z==INF) return 0;
for(i=0;i<=T;i++) if(V[i]) D[i]-=z;
return 1;
}
void solve(int ned){
flow=0, cost=0;
memset(D,0,sizeof D);
do memset(V,0,sizeof V),aug(S,INF); while(mdf());
if(flow==ned) printf("%d\n",cost);
else puts("impossible");
}
}zkw;
zkw费用流 学习笔记的更多相关文章
- 学习了ZKW费用流
所谓ZKW费用流,其实就是Dinic. 若干年前有一个人发明了最小增广路算法,每次用BFS找一条增广路,时间O(nm^2) 然后被DinicD飞了:我们为什么不可以在长度不变时多路增广呢?时间O(n^ ...
- 图论-zkw费用流
图论-zkw费用流 模板 这是一个求最小费用最大流的算法,因为发明者是神仙zkw,所以叫zkw费用流(就是zkw线段树那个zkw).有些时候比EK快,有些时候慢一些,没有比普通费用流算法更难,所以学z ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
- zkw费用流
期末结束,竞赛生活继续开始,先怒刷完寒假作业再说 至于期末考试,数学跪惨,各种哦智障错,还有我初中常用的建系大法居然被自己抛至脑后,看来学的还是不扎实,以后数学要老老实实学.物理被永哥黑了两分,然后很 ...
- 【zkw费用流】[网络流24题]餐巾计划问题
题目描述 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f ...
- zkw线段树学习笔记
zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...
- CSU 1948: 超级管理员(普通费用流&&zkw费用流)
Description 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上醒来发现自己成了一位仓管员.仓库可以被描述为一个n × m的网格,在每个网格上有几个箱子(可能没有).为 ...
- BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流
https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...
- P4015 运输问题【zkw费用流】
输入输出样例 输入 #1复制 2 3 220 280 170 120 210 77 39 105 150 186 122 输出 #1复制 48500 69140zuixiaofeiyo 说明/提示 1 ...
随机推荐
- Scrum立会报告+燃尽图(十月十七日总第八次)
本次作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公 ...
- “Hello World!团队”Beta发布—视频链接+文案+美工
视频链接:http://v.youku.com/v_show/id_XMzE3MjEyMzkyMA==.html?spm=a2h3j.8428770.3416059.1 文案+美工:http://ww ...
- lintcode-442-实现 Trie
442-实现 Trie 实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法. 注意事项 你可以假设所有的输入都是小写字母a-z. 样例 insert(&qu ...
- openssl 基本加密
openssl命令行工具详解(openssl的命令众多,请酌情处理与记忆) 在命令行输入:openssl asdf,可以显示openssl的命令说明 1:Standard commands(标准命 ...
- rfid工作原理
RFID的工作原理是:标签进入磁场后,如果接收到阅读器发出的特殊射频信号,就能凭借感应电流所获得的能量发送出存储在芯片中的产品信息(即Passive Tag,无源标签或被动标签),或者主动发送某一频率 ...
- SSH框架配置
--------------------------------applicationContext.xml-------------------------------- <?xml vers ...
- 【Linux笔记】CentOS&RHEL YUM基础知识
以下内容收集自网络,以作参考. 一.YUM是什么 YUM = Yellow dog Updater, Modified. 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它 ...
- hdu6021[BestCoder #93] MG loves string
这场BC实在是有趣啊,T2是个没有什么算法但是细节坑的贪心+分类讨论乱搞,T3反而码起来很顺. 然后出现了T2过的人没有T3多的现象(T2:20人,T3:30人),而且T2的AC率是惨烈的不到3% ( ...
- 【刷题】洛谷 P3676 小清新数据结构题
题目背景 本题时限2s,内存限制256M 题目描述 在很久很久以前,有一棵n个点的树,每个点有一个点权. 现在有q次操作,每次操作是修改一个点的点权或指定一个点,询问以这个点为根时每棵子树点权和的平方 ...
- 【JQuery】数据
一.前言 接着前一章的内容,继续本章的学习 二.内容 queue 显示或操作在匹配元素上执行的函数队列 .queue(queueName) 操作在匹配元素上执行的函数队列 .queue( ...