求費用流目前好像只有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一直往後延伸,然後從源點到匯點計算每條路,但是這樣只是單條路的最值,有時可能因為走一條路而間接的認定了除這條路以外的某個路通...