終於把最小費用最大流學會了啊……
各種奇奇怪怪的解釋我已經看多了,但在某些大佬的指點下,我終於會了。
原來是個好水的東西。
f' role="presentation">f
f,費用為
w' role="presentation">w
w,則總費用為fw
' role="presentation">fwf
w。 舉個例子,就像是有許多點的一張圖,有很多個管子相連,每個管子都有個容量,並且每流一流量就要花一些費用,問總費用最少是多少。
首先要知道ek演算法……
開玩笑的,其實根本不用,我還沒打過普通的ek呢,就只是打過dinic和sap。
這個做法其實很簡單:
1、用spfa從原點跑最短路,邊權為費用(滿流的邊不用跑)。
2、將最短路徑抽出,在上面找乙個殘餘容量最小的。
3、這一路上的殘餘容量減少,反向弧的容量增加(反向弧的費用為負的正向的費用)。
4、回到第一步,繼續做下去,直到從原點跑不到匯點。
這樣就可以算出來了,這就是最普通的ek+spfa做法。
當然還有更好的,但我還不會……
時間複雜度我不知道,畢竟,網路流的時間總是很玄學啊……
using namespace std;
#include
#include
#include
int n,m,s,t;
struct edge
e[100001];
intne;
edge *last[5001];
#define rev(ei) (e+(int((ei)-e)^1))
intq[1000001];
bool inq[5001];
bool spfa();
int dis[5001];
edge *pre[5001];
void flow(int&,int&);
int main()
; last[u]=e+ne;
++ne;
e[ne]=;
last[v]=e+ne;
++ne;
}int maxflow,mincost;
flow(maxflow,mincost);
printf("%d
%d\n",maxflow,mincost);
return0;}
bool spfa()
}inq[q[h]]=0;
}while (h!=t);
return dis[t]!=0x7f7f7f7f;
}void flow(int &maxflow,int &mincost)
}}
這個**我沒有對過任何的標程,相信各位可以憑藉自己的理解打出來,解析就不打了。 最小費用最大流
網 絡流的基本問題為 設乙個有向賦權圖g v,e v 其中有兩個特殊的節點s和s s稱為發點,s 稱為收點。圖中各 邊的方向和權數表示允許的流向和最大可能的流量 容量 問在這個網路圖中從發點流出到收點匯集,最大可通過的實際流量為多少?流向的分布情況為怎樣?設有乙個網路圖g v,e v e中的每條邊 ...
最小費用最大流
const int maxn 250 const int maxm 62272 const int inf 0x4ffffff int n,m struct edge edge maxm int head maxn cnt void init void addedge int u,int v,int...
最小費用最大流
看了最小費用最大流的問題,感覺好難啊,想不到,關鍵就是想不到,知道模板什麼用,只是能a題僅此而已,要想學深真的不是件容易的事情啊。為此我總結了以下幾點供複習知識點或者是講課時用 網路流的費用 在實際應用中,與網路流有關的問題,不僅涉及流量,而且還有費用的因素。網路的每一條邊 v,w 除了給定容量ca...