想看更多圖論題目?:
description
w公司有m個倉庫和n 個零售商店。第i 個倉庫有ai 個單位的貨物;第j 個零售商店需要bj個單位的貨物。貨物供需平衡,即
。從第i 個倉庫運送每單位貨物到第j 個零售商店的費用為cij 。試設計乙個將倉庫中所有貨物運送到零售商店的運輸方案,使總運輸費用最少。
對於給定的m 個倉庫和n 個零售商店間運送貨物的費用,計算最優運輸方案和最差運輸方案。
input
多組資料輸入.
每組輸入第1行有2 個正整數m和n,分別表示倉庫數和零售商店數。接下來的一行中有m個正整數ai ,1≤i≤m,表示第i個倉庫有ai 個單位的貨物。再接下來的一行中有n個正整數bj ,1≤j≤n,表示第j個零售商店需要bj 個單位的貨物。接下來的m行,每行有n個整數,表示從第i 個倉庫運送每單位貨物到第j個零售商店的費用cij 。
output
每組輸出最少運輸費用和最多運輸費用
sample input
2 3220 280
170 120 210
77 39 105
150 186 122
sample output
48500
69140
題目出自nefu492
思路:首先求最小費用,就是乙個裸的最小費用最大流問題了,建立源點匯點,源點連線n個點,m個點連線匯點,然後n個點與m個點之間相互連邊,跑乙個最小費用流就ok。
然後相對麻煩點兒的是最大費用,其實也不麻煩,只是建圖的時候稍微變一下就ok了,將n個點與m個點之間連邊的時候將其費用化成相反數,然後跑一遍最小費用流,結果取反就是anser~
#include #include #include #include#include#include#include#includeusing namespace std;
typedef long long ll;
const int oo=1e9;
const int mm=11111111;
const int mn=888888;
int node,src,dest,edge;
int ver[mm],flow[mm],cost[mm],nex[mm];
int head[mn],dis[mn],p[mn],q[mn],vis[mn];
/**這些變數基本與最大流相同,增加了cost 表示邊的費用,p記錄可行流上節點對應的反向邊*/
void prepare(int _node,int _src,int _dest)
return p[dest]>-1;
}int spfaflow()/**源點到匯點的一條最短路即可行流,不斷的找這樣的可行流*/
return ret;
}int a[10005],b[10005],x[10005][10005];
int main()
for(int i=1; i<=m; i++)
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
printf("%d\n",spfaflow());
prepare(n+m+2,0,n+m+1);
for(int i=1; i<=n; i++)
addedge(0,i,a[i],0);
for(int i=1; i<=m; i++)
addedge(i+n,n+m+1,b[i],0);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
addedge(i,j+n,oo,-x[i][j]);
printf("%d\n",-spfaflow());
}return 0;
}
最小費用流
include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...
最小費用流
int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...
最小費用流
acm模版 最小費用流 o v e f init network g g.build v,e call g.mincost s,t flow g.flow cost g.cost 注意 spfa增廣,實際複雜度遠遠小於o v e define typef int type of flow defin...