有 \(n\) 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量\(a_i\)不等。
如何用最少搬運量可以使 \(n\) 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。
資料保證一定有解。
這道題與運輸問題有一些相似點。可以將這些倉庫分成兩類,一類是比最終數量多的倉庫,另一類是比最終數量少的倉庫。
最終數量為所有倉庫庫存數量的均值,即\(tot = \sum_^n a_i / n\)
比最終數量多的倉庫要運輸出去的量其實就是\(a_i - tot\);比最終數量少的倉庫要運輸出去的量是\(tot - a_i\)。
設立虛擬源點\(s\),與比最終數量多的倉庫連容量是\(a_i - tot\),費用是\(0\)的邊;
設立虛擬匯點\(t\),比最終數量少的倉庫與\(t\)連容量是\(tot - a_i\),費用是\(0\)的邊。
因為一開始不夠的倉庫可能在中間過程中超過了目標容量,因此也有可能需要向旁邊的倉庫輸出庫存。
每個倉庫向旁邊兩個倉庫,連容量是\(\infty\),費用是\(1\)的邊。
跑最小費用流即可。
#include #include #include #include #include using namespace std;
const int n = 110, m = 610, inf = 1e8;
int n, s, t;
int s[n];
int h[n], e[m], ne[m], f[m], w[m], idx;
int d[n], pre[n], incf[n];
bool st[n];
void add(int a, int b, int c, int d)
bool spfa()}}
}return incf[t] > 0;
}int ek()
}return cost;
}int main()
tot /= n;
for(int i = 1; i <= n; i ++)
for(int i = 1; i <= n; i ++)
printf("%d\n", ek());
return 0;
}
網路流24題 負載平衡問題(費用流)
題目描述 要求最後所有倉庫的庫存相同,那麼就可以想到求出這個值,也就是倉庫庫存量的平均值delta。如果某乙個倉庫的庫存量x大於這個平均值,那麼就從源點向這個店連一條流量為x delta的邊,表示這個倉庫可以向外搬運的貨物數量,費用為0。反之,如果某乙個倉庫的存貨量小於x這個平均值,就從這個店向匯點...
網路流24題 負載平衡(費用流)
cogs 很簡單的題面呀 源點向每個點連邊,容量為貨物量,費用為0 因為最後要每個倉庫的貨物都相同 所以從每個倉庫向匯點連邊,費用為0,容量為平均數 因為可以丟到相鄰的倉庫 所以向相鄰的倉庫連邊,費用為1,容量為inf 然後就是費用流 include include include include ...
網路流24題 負載平衡問題
題目描述 g 公司有n 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。對於給定的n 個環形排列的倉庫的庫存量,程式設計計算使n 個倉庫的庫存數量相同的最少 搬運量。這題我貌似做過的樣子 不過當時的做法是...