網路流之費用流

2021-08-02 05:25:13 字數 1170 閱讀 9287

求費用流目前好像只有ek+spfa改版,時間複雜度為o(n*e*k),其中k為最大流值。但時間上的期望時間複雜度為:o(a*e*k),其中a為所有頂點進佇列的平均次數,可以證明a一般小於等於2。

最小費用最大流:

#include using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 205;

struct node

edge[maxn*maxn];

int no, n, m, s, t;

int head[maxn], dis[maxn], vis[maxn], pre[maxn], rec[maxn];

queueq;

inline void init()

inline void add(int u, int v, int w, int f)

int spfa(int s, int t)

}k = edge[k].next;

} }if(dis[t] == inf) return 0;

return 1;

}pairmcmf(int s, int t)

k = t; maxflow += minflow;

while(k != s)

}return make_pair(maxflow, mincost);

}int main()

pairans = mcmf(s, t);

cout << ans.first << " " << ans.second << endl;

return 0;

}

有時候也會遇到最大費用最大流,其實只要在建圖時將所有費用取負,最後求的最小費用取負就是最大費用。

最小費用最大流是指滿足源點流出的流量最大時,總費用最小的乙個網路,模板都是基於此。

最大費用最大流則是將所有的費用取負,然後再跑一遍最小費用最大流,將最終的最小費用取負就是最大流量下的最大費用了。

最大費用可行流關注的是費用而非流量是否最大,那麼當我們在尋找可改進路時如果從源點到匯點的dis變成大於0的時侯,則表明可改進路不會再減少費用了,所以在spfa尋找增廣路時return的條件改為dis[t] <= 0即可。

最小費用可行流沒有意義。

繼續加油~

網路流之費用流

發現我真的是比較玄學,寒假主學最大流的時候忘記搞一下費用流了。然後現在來補。其實如果理解了最大流的思想和演算法的話還是很好寫的。畢竟就是把ek的bfs改成spfa 關於費用流的定義,我們在一般的網路流的定義上給每條邊加上乙個邊權,邊權的意義就是流量的單價 也就是每1單位的流經過這條邊,那麼就要邊權的...

網路流 費用流

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

網路流 費用流

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