網路流之費用流

2022-04-02 23:15:46 字數 1415 閱讀 1931

發現我真的是比較玄學,寒假主學最大流的時候忘記搞一下費用流了。然後現在來補。

其實如果理解了最大流的思想和演算法的話還是很好寫的。畢竟就是把ek的bfs改成spfa

關於費用流的定義,我們在一般的網路流的定義上給每條邊加上乙個邊權,邊權的意義就是流量的單價(也就是每1單位的流經過這條邊,那麼就要邊權的費用)。

所以在乙個網路圖中最大流可能有挺多個,但是在最大流中肯定有一種流法在滿足最大流的情況下保證流量最小

這就是我們重點要講的最小費用最大流(mcmf)

首先在講這個演算法之前,你必須掌握最大流的相關東西,可以參照網路流之最大流

然後在最大流中我們不是提到用增廣路來求最大流嗎,那麼用什麼來找呢?

好吧就是神奇的bfs,bfs的遍歷可以保證在殘量網路中找到乙個流

可是這個方法只保證了流量最大,可能會出現讓總費用大的路徑代替總費用小的路徑。

那還不很傷?其實也很簡單。

我們只需要把bfs改成sfpa即可,而跑最短路的時候就是求費用的最短路。

那麼就可以簡單地用ek求mcmf了。

不過這裡為什麼只用spfa,dj不是很穩定嗎?

其實dj也是可以的,但是由於網路流的基本性質——反向邊。這樣費用就可能為負,就無法用dj求解了。

不過這個其實是有辦法避免的,不過技巧性太強,不予討論。

然後給出板子題luogu p3381 【模板】最小費用最大流的code

#include#include#includeusing namespace std;

const int n=5005,m=100005;

queue q;

struct edge

e[m];

int head[n],last[n],pre[n],dis[n],cap[n],cnt=-1,n,m,x,y,c,f,s,t;

bool vis[n];

inline char tc(void)

inline void read(int &x)

inline void add(int x,int y,int c,int f)

inline int min(int a,int b)}}

return pre[t]^-1;

}inline void mcmf(void)

}printf("%d %d",res,tot);

}int main()

mcmf(); return 0;

}

網路流之費用流

求費用流目前好像只有ek spfa改版,時間複雜度為o n e k 其中k為最大流值。但時間上的期望時間複雜度為 o a e k 其中a為所有頂點進佇列的平均次數,可以證明a一般小於等於2。最小費用最大流 include using namespace std const int inf 0x3f3...

網路流 費用流

這個好像不考 沒事可以騙分 費用流,顧名思義,就是有費用的流,也就是說,給乙個網路流圖中的每條弧增加乙個單位流量費用。一般來說求解的費用流都是最大流最小費用。好像沒什麼好bb的 這裡推薦使用zkw演算法求解最小費用流,看著 理解就行,應該還是很好理解的。zkw演算法在稠密圖上跑得飛快,在稀疏圖上還不...

網路流 費用流

網路流有很多種類 其中最大流 有增廣路演算法和預流推進演算法。增廣路演算法就是不斷的新增增廣路。其中的dinic演算法。會稍微提到isap演算法 poj1273 首先想到dfs一直往後延伸,然後從源點到匯點計算每條路,但是這樣只是單條路的最值,有時可能因為走一條路而間接的認定了除這條路以外的某個路通...