P3381 模板 最小費用最大流

2022-08-13 01:42:10 字數 1257 閱讀 4101

我其實不會ek,只會死記dinic,事實證明ek演算法非常的淺顯易懂。

ek演算法是怎麼弄的?

說白了就是乙個bfs找增廣路徑,只要有流量可以流,就去增廣一波。

如果探到了t點的話,就可以進行一次成功的增廣了。

如何實現?

我們需要兩個輔助陣列,比dinic多。

flow陣列,表示乙個點目前可以流的流量。

last陣列,表示終邊為這個點的邊的下標。

fa陣列,表示乙個點的父結點,直至源點。

發現ek演算法去更新答案減流量的時候,不像dinic那樣用dfs做,而是乙個迴圈解決。

如何使用迴圈解決?就利用上面的三個陣列。

mcmf問題,只需要在ek的做法上,用spfa代替那個bfs。

如同一位dalao說的:ek演算法的主體就是spfa或者bfs。更新操作不過是輔助而已。

使用spfa,可以求最短路徑。在這裡,用來求最小費用。

在最小費用上,如果能增廣,就增廣。最終得到的就是最小費用前提下的最大流。

**:

#include#include#include#includeconst int maxn = 5005, maxm = 50005, inf = 0x3f3f3f3f;

struct edges

e[maxm << 1];

int head[maxn], tot = 1;

int n, m, s, t;

int maxflow, mincost;

int dist[maxn];

bool vis[maxn];

int fa[maxn];

int flow[maxn];

int last[maxn];

int read()

while(ch >= '0' && ch <= '9')

return s * ans;

}void link(int u, int v, int w, int c)

; head[u] = tot;

}void addedges(int u, int v, int w, int c)

bool spfa()}}

}return dist[t] != inf;

}void update()

}void ek()

int main()

ek();

printf("%d %d\n", maxflow, mincost);

return 0;

}

P3381 模板 最小費用最大流

如題,給出乙個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。include define ll long long define inf 0x3f3f3f3f using namespace std const int n 1e5 10 i...

P3381 模板 最小費用最大流

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

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

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