分析

记\(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. 总结在Visual Studio Code运行node.js项目遇到的问题

    一.cannot find module “lodash” 项目运行时出现以下错误: Error: Cannot find module 'lodash' at Function.Module._re ...

  2. A8

    组员:陈锦谋 今日内容: PS学习.抠图.图标像素调整 明日计划: 继续小组内安排的任务 困难: 无

  3. 【week11】psp

    本周psp 项目 内容 开始时间 结束时间 被打断 净时间 11.26(星期六)  看论文 psiBlast  9:00 12:00  5  175    11.28(星期一)  做作业 设计模式作业 ...

  4. gearman参数说明

    -b, –backlog=BACKLOG 连接请求队列的最大值 -d, –daemon Daemon 守护进程化 -f, –file-descriptors=FDS 可打开的文件描述符数量 -h, – ...

  5. PHP 在windows下配置sendmail,通过 mail() 函数发送邮件

    php mail()函数在windows不能用,需要安装sendmail. 1. 从http://glob.com.au下载sendmail.zip 2. 解压sendmail.zip到目录下(最好使 ...

  6. pcap的安装与配置

    1.打开网址:www.tcpdump.org/ 下载 libpcap-1.0.0.tar.gz (512.0KB) 软件包,通过命令 tar zxvf libpcap-1.0.0.tar.gz 解压文 ...

  7. HashMap的扩容机制以及默认大小为何是2次幂

    HashMap的Put方法 回顾HashMap的put(Key k, Value v)过程: (1)对 Key求Hash值,对n-1取模计算出Hash表数组下标 (2)如果没有碰撞,直接放入桶中,即H ...

  8. h5端提示下载app

    // app下载提示 if (!sessionStorage.getItem("appDownloadTipClosed") && isAndroidOrIphon ...

  9. ZOJ3084_S-Nim

    题目的意思是这样的,给定你若干堆石子,每次你可以从任一堆取出某些固定数量的石子,每次取完后必须保证没堆石子的数量不为0,谁无法操作了就算fail. 刚刚开始看题目的时候有点也没有思路,甚至连Sg函数也 ...

  10. 【Java】自动获取某表某列的最大ID数

    使用场景: 当需要往数据库插入数据时,表的主键需要接着已经有的数据后面进行自增.比如已经wq_customer表里,主键为TBL_ID,如果是空表,那么插入的数据TBL_ID设置为1,如果已经有n条数 ...