題意:
有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...