P4016 負載平衡問題 網路流

2022-05-03 14:06:14 字數 1818 閱讀 6738

gg 公司有 nn 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 nn個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。

輸入格式:

檔案的第 11 行中有 11 個正整數 nn,表示有 nn 個倉庫。

第 22 行中有 nn 個正整數,表示 nn 個倉庫的庫存量。

輸出格式:

輸出最少搬運量。

輸入樣例#1: 複製

5

17 9 14 16 4

輸出樣例#1: 複製

11
1 \leq n \leq 1001≤n≤100

#include #include 

#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;

}

view code

P4016 負載平衡問題 網路流重溫

這個題目現在第二次做,感覺沒有這麼簡單,可能是我太久沒有寫這種題目了,基本上都忘記了,所以我連這個是費用流都沒有看出來。有點小傷心,知道是費用流之後,我居然還拆點了。這個寫完之後確實感覺沒有那麼難,但是寫的過程還是很艱辛的,這個為什麼是乙個費用流呢,因為我們知道每移動乙個單位的貨物,就會產生一單位的...

P4016 負載平衡問題

方法二 p4016 負載平衡問題 g 公司有 n 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。輸入格式 第一行乙個正整數 n,表示有 n 個倉庫。第二行 n 個正整數,表示 n 個倉庫的庫存量。輸出...

P4016 負載平衡問題 費用流

有 n le 100 個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。費用流模型,每個倉庫建乙個點,各個倉庫之間相互連邊,費用為 1,倉庫與源連邊,流量按照題意設定,倉庫與匯點連邊,流量是最終的平均流量...