網路流24題 運輸問題

2021-07-03 10:20:45 字數 1802 閱讀 8197

題意:

有m個倉庫,n個零售商店,兩兩之間有運送貨物的單位費用;

對於給定的倉庫的儲存量和商店的需求量,計算最優運輸方案和最差運輸方案; 

題解:

建圖:從源點s到每個倉庫連容量為貨物數的邊;

從每個商店到匯點t連容量為貨物數的邊;

倉庫與商店間兩兩連容量無限,費用為單位費用的邊;

分別求出最小費用最大流和最大費用最大流就是答案;

不過,對於最大費用的處理上,有兩種方法;

第一種是將邊的費用全都置為相反數,求出最小費用,再取反就是答案;

第二種是跑最長路的spfa,這樣每次都是費用最大的增廣路,也可以得到最大費用最大流;

但是第二種有些需要注意,陣列必須清成負無窮,因為可能會在過程中出現負權無法處理;

還有就是最後判斷能否增廣時,最好判斷負無窮而不是大於0;

因為題中要求的是最大流,而有可能為了使流最大而必須讓費用減小;

由於這題本身性質,判》0可以通過,但是在深海機械人問題裡就不可以了;

事實上,判斷》0求出的是最大費用而不是最大流;

**:

相反數法:

#include#include#include#include#define n 300

#define m 11000

using namespace std;

queueq;

int to[m],val[m],flow[m],next[m],head[n],tot;

int dis[n],pre[n],s,t;

bool inq[n];

void add(int x,int y,int v,int fl)

bool spfa()}}

if(dis[t]==0x3f3f3f3f)

return 0;

else

return 1;

}int mcmf()

void rebuild()

}int main()

printf("%d\n",ans);

rebuild();

ans=0;

while(spfa())

printf("%d\n",-ans);

return 0;

}

最長路法:

#include#include#include#include#define n 120

#define m 6010

using namespace std;

queueq;

int to[m],val[m],flow[m],next[m],head[n],tot;

int dis[n],pre[n],s,t;

bool inq[n];

void add(int x,int y,int v,int fl)

bool spfa1()}}

if(dis[t]==0x3f3f3f3f)

return 0;

else

return 1;

}bool spfa2()

int mcmf()

void rebuild()

}int main()

printf("%d\n",ans);

rebuild();

ans=0;

while(spfa2())

printf("%d\n",ans);

return 0;

}

網路流24題 運輸問題

題目描述 description w 公司有m個倉庫和n 個零售商店。第i 個倉庫有ai 個單位的貨物 第j 個零售商店需要bj個單位的貨物。貨物供需平衡,即 sum si sum bj 從第i 個倉庫運送每單位貨物到第j 個零售商店的費用為cij 試設計乙個將倉庫中所有貨物運送到零售商店的運輸方案...

網路流24題 運輸問題

題目傳送門 最小費用最大流,最大費用最大流 源點與倉庫相連,流量為a i 費用0 匯點與商店相連,流量為b i 費用為0 倉庫與商店相連,流量無限,費用為c i j 最大費用最大流轉換成最小費用最大流,方法就是建圖的時候把費用變成相反數跑最小費用最大流,最後答案取相反數即可 include incl...

網路流24題 運輸問題(費用流)

cogs 大水題。源點向倉庫連,容量為貨物量,費用為0 倉庫向商店連,容量inf,費用題目給出來了 商店向匯點連,容量為需求量,費用為0 簡直裸的費用流 include include include include include include include include include i...