洛谷P3381 Dijkstra版費用流

2021-10-08 03:54:27 字數 929 閱讀 7849

鑑於spfa很容易被卡,所以學了一手dij跑費用流

具體參考:雖然有個小地方少了個負號,不過還好

區別就是把(u->v)邊權變成cost+h[u]-h[v],先用spfa算出dis當h[i],然後每次跑完mcf,由於負權邊的容量可能增加能選了,就要h[i]+=dis[i]這樣動態維護,就能保證每條邊都是正的

#includeusing namespace std;

typedef long long ll;

typedef pairp;

const int maxl=5010;

const int maxm=1e5+10;

const ll inf=1ll<<60;

int n,m,s,t,cnt;

ll ans,flow;

int ehead[maxl],frm[maxl];

ll dis[maxl],h[maxl];

struct ed

e[maxm<<1];

bool in[maxl];

inline void add(int u,int v,ll w,ll c)

inline void prework()

}inline void spfa()

}} }

}inline bool dij()

); int u,v;p d;

while(!q.empty())

); }

} return dis[t]0)

i=frm[t];

while(i>0)

flow+=x;

ans+=x*(dis[t]+h[t]);

}inline void mainwork()

}inline void print()

int main()

洛谷P3381 MCMF 網路流

如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。第一行包含四個正整數n m s t,分別表示點的個數 有向邊的個數 源點序號 匯點序號。接下來m行每行包含四個正整數ui vi wi fi,表示第i條有向邊從ui出發,到達vi,邊...

洛谷 P3381 模板 最小費用最大流

乙個網路圖雖然最大流確定,但達到最大流的方案並不唯一。如果對於每條邊,都加乙個費用f,表示這條邊流過單位流量的代價,求達到最大流時的最小費用,這就是最小費用最大流問題。解決方法 ek費用流或zwk費用流。這裡只講ek費用流。採用貪心的思想。我們每次增廣時都選擇費用最小的一條。這樣,因為最大流是確定的...

洛谷 P3381 模板 最小費用最大流

題目鏈結 mcmf 最小費用最大流 由於要使用反向邊。定義乙個h i 表示從匯點到i的最短距離。對於一條邊e v,u e.cost e.cost h v h u 這樣可以保證圖中沒有負權邊的存在,這樣就可以使用dij來求最短路。每次求一條最短路,然後通過這條最短路更新最大流,直到找不出最短路為止。i...