GDKOI2014 石油儲備計畫

2021-09-24 16:04:46 字數 1638 閱讀 5230

description

input

output

對於每組資料,輸出乙個整數,表示達到「平衡」狀態所需的最小代價。

sample input

2

36 1 5

1 2 1

2 3 2

54 5 4 3 2

1 3 1

1 2 2

2 4 3

2 5 4

sample output

4

4樣例解釋:

對於第一組資料,從城市1到城市2運輸2桶石油,代價為1*2=2;從城市3往城市2運輸1桶石油,代價為2*1=2。此時三個城市儲備量都為4桶,該狀態的平衡度為0。

對於第二組資料,從城市2到城市5運輸1桶石油,代價為1*4=4;此時五個城市儲備量為(4,4,4,3,3),該狀態的非平衡度為1.2,是能達到的所有狀態的最小值。

data constraint

對於20%的資料,n<=15

對於100%的資料,t<=10,n<=100,0<=si<=10000,1<=x,y<=n,1<=z<=10000。

首先容易得到結論:達到平衡狀態時,每個點的油量要麼為(sum/n),要麼為(sum/n)+1,現在每個點有乙個初始容量,在樹上相鄰的點可以轉移石油。

我們可以據此建模

對於s向每個點,連一條上下界均為初始量的邊,費用為0,表示最初容量,

對於每個點向t,連一條下界為(sum/n),上界為(sum/n)+1的邊,表示經轉移後的容量

對於原樹上相鄰的點,連一條下界為0,上界為正無窮,費用為距離的邊,表示轉移可用的路徑

然後跑一遍最小費用可行流即可

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int g[2001],next[2011],y[2011],cost[2011],flow[2011

];int que[2000011],dis[2011],lb[2011],mn[2011],vis[2011

];int du[2011],a[2011

];int

tt,tl,n,i,s,t,s,t,x,z,q,sum,dt,tj;

ll ans;

void star(int i,int j,int k,int

l)void spfa()//

記錄dis(最短路),min(最小流量),lb(連過的邊,退流用)}}

j=next[j];

}l++;

vis[x]--;

}}void

minflow()

}}int

main()

for(i=1;i<=n;i++)

for(i=1;i)

star(t,s,

21474836,0

);

for(i=1;i<=t;i++)

minflow();

printf(

"%lld\n

",ans);}}

GDKOI2014 石油儲備計畫

description input output 對於每組資料,輸出乙個整數,表示達到 平衡 狀態所需的最小代價。sample input 2 36 1 5 1 2 1 2 3 2 54 5 4 3 2 1 3 1 1 2 2 2 4 3 2 5 4 sample output 4 4樣例解釋 對於...

GDKOI2014 石油儲備計畫

description input output 對於每組資料,輸出乙個整數,表示達到 平衡 狀態所需的最小代價。sample input 2 36 1 5 1 2 1 2 3 2 54 5 4 3 2 1 3 1 1 2 2 2 4 3 2 5 4 sample output 4 4樣例解釋 對於...

GDKOI2014模擬 樹的直徑

並不想講。樹的直徑有乙個性質。現在有兩棵樹,如果把它們隨意連一條邊,會變成一棵樹,新樹的直徑的端點一定是之前兩棵樹的直徑的共4個端點的兩個。code include include define fo i,x,y for int i x i y i define fd i,x,y for int i...