LUOGU P4016 負載平衡問題

2022-05-12 10:48:13 字數 1431 閱讀 5897

題目描述

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

第一種方法就是環形均分紙牌,和糖果傳遞一模一樣。

第二種方法是網路流,建立超級源點s,s向比平均值大的連一條容量為a[i]-平均值,花費為0的邊,建立超級源點t,比平均值小的點向t連一條容量為平均值-a[i],花費為0的邊,然後每個點向它左右連一條容量為inf,花費為1的邊,然後跑費用流即可。

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 10005;

const

int inf = 0x3f3f3f3f;

inline

int rd()

while(isdigit(ch))

return f?x:-x;

}int n,a[maxn],sum,head[maxn],cnt=1,s,t;

int to[maxn<<1],nxt[maxn<<1],val[maxn<<1],cost[maxn<<1];

int incf[maxn],pre[maxn],dis[maxn],ans;

bool vis[maxn];

queue

q;inline

void add(int bg,int ed,int w,int c)

bool spfa()

}vis[x]=0;

}if(dis[t]==inf) return

false;

return

true;

}void update()

ans+=dis[t]*incf[t];

}int main()

for(register

int i=2;i1,inf,1),add(i,i+1,inf,1);

add(1,2,inf,1),add(1,n,inf,1);

add(n,n-1,inf,1),add(n,1,inf,1);

while(spfa()) update();cout

0;}

luogu P4016 負載平衡問題

本題有數學貪心解法和費用流解法 數學解法就看看luogu題解吧,窩太菜了 費用流就找建圖法,依舊是設超級源點和匯點,初始資料就源點s向該點連點,流量就是初始量,代價為0,然後每個倉庫向相鄰的點連邊,容量無限大,代價為1,再每個倉庫向匯點連點,容量就是sum n,代價為0,直接跑最大流最小費就行了,這...

LuoguP4016 負載平衡問題 費用流

g 公司有 n個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使 n個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。輸入格式 檔案的第 11 行中有 11 個正整數 n,表示有 n個倉庫。第 22 行中有 n個正整數,表示 n個倉庫的庫存量。輸出格式 輸出最...

P4016 負載平衡問題

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