負載平衡問題(費用流,網路流24題)

2022-06-08 13:30:17 字數 1125 閱讀 5682

有 \(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 個倉庫的庫存數量相同的最少 搬運量。這題我貌似做過的樣子 不過當時的做法是...