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失敗的條件,有:

\[\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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM