分析

记\(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失败的条件,有:

\[\begin{aligned}
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费用流 学习笔记的更多相关文章

  1. 学习了ZKW费用流

    所谓ZKW费用流,其实就是Dinic. 若干年前有一个人发明了最小增广路算法,每次用BFS找一条增广路,时间O(nm^2) 然后被DinicD飞了:我们为什么不可以在长度不变时多路增广呢?时间O(n^ ...

  2. 图论-zkw费用流

    图论-zkw费用流 模板 这是一个求最小费用最大流的算法,因为发明者是神仙zkw,所以叫zkw费用流(就是zkw线段树那个zkw).有些时候比EK快,有些时候慢一些,没有比普通费用流算法更难,所以学z ...

  3. zkw费用流+当前弧优化

    zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...

  4. zkw费用流

    期末结束,竞赛生活继续开始,先怒刷完寒假作业再说 至于期末考试,数学跪惨,各种哦智障错,还有我初中常用的建系大法居然被自己抛至脑后,看来学的还是不扎实,以后数学要老老实实学.物理被永哥黑了两分,然后很 ...

  5. 【zkw费用流】[网络流24题]餐巾计划问题

    题目描述 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f ...

  6. zkw线段树学习笔记

    zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...

  7. CSU 1948: 超级管理员(普通费用流&&zkw费用流)

    Description 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上醒来发现自己成了一位仓管员.仓库可以被描述为一个n × m的网格,在每个网格上有几个箱子(可能没有).为 ...

  8. BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流

    https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...

  9. P4015 运输问题【zkw费用流】

    输入输出样例 输入 #1复制 2 3 220 280 170 120 210 77 39 105 150 186 122 输出 #1复制 48500 69140zuixiaofeiyo 说明/提示 1 ...

随机推荐

  1. Scrum立会报告+燃尽图(十月十七日总第八次)

    本次作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公 ...

  2. “Hello World!团队”Beta发布—视频链接+文案+美工

    视频链接:http://v.youku.com/v_show/id_XMzE3MjEyMzkyMA==.html?spm=a2h3j.8428770.3416059.1 文案+美工:http://ww ...

  3. lintcode-442-实现 Trie

    442-实现 Trie 实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法. 注意事项 你可以假设所有的输入都是小写字母a-z. 样例 insert(&qu ...

  4. openssl 基本加密

    openssl命令行工具详解(openssl的命令众多,请酌情处理与记忆) 在命令行输入:openssl asdf,可以显示openssl的命令说明   1:Standard commands(标准命 ...

  5. rfid工作原理

    RFID的工作原理是:标签进入磁场后,如果接收到阅读器发出的特殊射频信号,就能凭借感应电流所获得的能量发送出存储在芯片中的产品信息(即Passive Tag,无源标签或被动标签),或者主动发送某一频率 ...

  6. SSH框架配置

    --------------------------------applicationContext.xml-------------------------------- <?xml vers ...

  7. 【Linux笔记】CentOS&RHEL YUM基础知识

    以下内容收集自网络,以作参考. 一.YUM是什么 YUM = Yellow dog Updater, Modified. 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它 ...

  8. hdu6021[BestCoder #93] MG loves string

    这场BC实在是有趣啊,T2是个没有什么算法但是细节坑的贪心+分类讨论乱搞,T3反而码起来很顺. 然后出现了T2过的人没有T3多的现象(T2:20人,T3:30人),而且T2的AC率是惨烈的不到3% ( ...

  9. 【刷题】洛谷 P3676 小清新数据结构题

    题目背景 本题时限2s,内存限制256M 题目描述 在很久很久以前,有一棵n个点的树,每个点有一个点权. 现在有q次操作,每次操作是修改一个点的点权或指定一个点,询问以这个点为根时每棵子树点权和的平方 ...

  10. 【JQuery】数据

    一.前言        接着前一章的内容,继续本章的学习 二.内容 queue 显示或操作在匹配元素上执行的函数队列 .queue(queueName) 操作在匹配元素上执行的函数队列 .queue( ...