gg 公司有 nn 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 nn個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。
輸入格式:
檔案的第 11 行中有 11 個正整數 nn,表示有 nn 個倉庫。
第 22 行中有 nn 個正整數,表示 nn 個倉庫的庫存量。
輸出格式:
輸出最少搬運量。
輸入樣例#1: 複製
5輸出樣例#1: 複製17 9 14 16 4
111 \leq n \leq 1001≤n≤100
#include #includeview code#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace
std;
typedef
long
long
ll;const
int inf = 0x3f3f3f3f
;const
int maxn = 1000 + 10
;struct
edge
};vector
e;vector
g[maxn];
int a[maxn];//
找增廣路每個點的水流量
int p[maxn];//
每次找增廣路反向記錄路徑
int d[maxn];//
spfa演算法的最短路
int inq[maxn];//
spfa演算法是否在佇列中
ints, t;
void init(int
n)void add(int u, int v, int c, int
cost)
bool bellman(int s, int t, int& flow, long
long &cost)
//bellman 演算法入隊
} }
}if (d[t] == inf)return
false;//
找不到增廣路
flow += a[t];//
最大流的值,此函式引用flow這個值,最後可以直接求出flow
cost += (long
long)d[t] * (long
long)a[t];//
距離乘上到達匯點的流量就是費用
for (int u = t; u != s; u = e[p[u]].u)//
逆向存邊
return
true;}
int maxflow(int s, int t, long
long &cost)
intexa[maxn];
intmain()
int len = sum /n;
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
add(
1, n, inf, 1
); add(n,
1, inf, 1
); ll cost = 0
;
int an =maxflow(s, t, cost);
printf(
"%lld\n
", cost);
return0;
}
P4016 負載平衡問題 網路流重溫
這個題目現在第二次做,感覺沒有這麼簡單,可能是我太久沒有寫這種題目了,基本上都忘記了,所以我連這個是費用流都沒有看出來。有點小傷心,知道是費用流之後,我居然還拆點了。這個寫完之後確實感覺沒有那麼難,但是寫的過程還是很艱辛的,這個為什麼是乙個費用流呢,因為我們知道每移動乙個單位的貨物,就會產生一單位的...
P4016 負載平衡問題
方法二 p4016 負載平衡問題 g 公司有 n 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。輸入格式 第一行乙個正整數 n,表示有 n 個倉庫。第二行 n 個正整數,表示 n 個倉庫的庫存量。輸出...
P4016 負載平衡問題 費用流
有 n le 100 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。費用流模型,每個倉庫建乙個點,各個倉庫之間相互連邊,費用為 1,倉庫與源連邊,流量按照題意設定,倉庫與匯點連邊,流量是最終的平均流量...