【GDKOI2014】JZOJ2020年8月13日提高组T2 石油储备计划

题目

Description

Input

Output

对于每组数据,输出一个整数,表示达到“平衡”状态所需的最小代价。

Sample Input

2

3

6 1 5

1 2 1

2 3 2

5

4 5 4 3 2

1 3 1

1 2 2

2 4 3

2 5 4

Sample Output

4

4

Data Constraint

对于20%的数据,N<=15

对于100%的数据,T<=10,N<=100,0<=si<=10000,1<=X,Y<=N,1<=Z<=10000。

Hint

对于第一组数据,从城市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,是能达到的所有状态的最小值。

题解

题意

给出一棵树,有边权

定义一个非平衡度(如题)

问如何运输使得非平衡度最小,且代价最低

分析

很容易发现非平衡度最小有两种情况

  1. 当\(sum\%n=0\),答案为\(\dfrac{sum}{n}\)
  2. 若不为0,答案为\(\left \lfloor\dfrac{sum}n{}\right \rfloor\)或\(\left \lfloor\dfrac{sum}n{}\right \rfloor+1\)

那么容易想到最小费用最大流

  • 所有点往源点连一条流量为油桶数量,费用为0的边
  • 所有点往汇点连一条流量为\(\left \lfloor\dfrac{sum}n{}\right \rfloor\),费用为0的边
  • 对于读入的点,连流量正无穷,费用读入的边(注意是双向,加上反向弧总共4条)

然后跑一遍最小费用最大流

随后把所有连向汇点的边流量加一

再跑一遍

两次答案之和即为答案

Code

#include<bits/stdc++.h>
#define rg register
#define inf 999999999999
using namespace std;
struct node
{
long long to,next,val,flow;
}a[5005];
long long t,n,x,y,z,S,T,ans,ans1,tot,sum,head[5005],bj[5005],dis[5005],sy[5005];
inline void add(long long x,long long y,long long z,long long v)
{
a[tot].to=y;
a[tot].flow=z;
a[tot].val=v;
a[tot].next=head[x];
head[x]=tot;
++tot;
}
inline long long OK()
{
long long plus=inf;
for (rg long long i=0;i<=n+2;++i)
if (bj[i])
for (rg long long j=head[i];j!=-1;j=a[j].next)
if (!bj[a[j].to]&&a[j].flow) plus=min(plus,dis[a[j].to]+a[j].val-dis[i]);
if (plus==inf) return 0;
for (rg long long i=0;i<=n+2;++i)
{
if (bj[i])
{
bj[i]=0;
dis[i]+=plus;
}
}
return 1;
}
inline long long wwl(long long now,long long ss)
{
if (now==T)
{
ans1+=dis[S]*ss;
return ss;
}
bj[now]=1;
long long u,x;
for (rg long long i=head[now];i!=-1;i=a[i].next)
{
u=a[i].to;
if (!bj[u]&&dis[u]+a[i].val==dis[now]&&a[i].flow)
{
x=wwl(u,min(ss,a[i].flow));
if (x)
{
a[i].flow-=x;
a[i^1].flow+=x;
return x;
}
}
}
return 0;
}
inline void ffl()
{
long long q;
while (OK())
{
q=wwl(S,inf);
while (q)
{
memset(bj,0,sizeof(bj));
q=wwl(S,inf);
}
}
}
int main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
scanf("%lld",&t);
while (t--)
{
memset(head,-1,sizeof(head));
memset(a,0,sizeof(a));
memset(dis,0,sizeof(dis));
memset(bj,0,sizeof(bj));
scanf("%lld",&n);
S=n+1;
T=n+2;
ans=sum=ans1=0;
tot=0;
for (rg long long i=1;i<=n;++i)
{
scanf("%lld",&x);
add(S,i,x,0);
add(i,S,0,0);
sum+=x;
}
for (rg long long i=1;i<n;++i)
{
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,inf,z);
add(y,x,0,-z);
add(y,x,inf,z);
add(x,y,0,-z);
}
sum/=n;
for (rg long long i=1;i<=n;++i)
{
add(i,T,sum,0);
add(T,i,0,0);
}
bj[S]=1;
ffl();
for (rg long long i=2;i<=tot;++i)
if (a[i].to==T)
a[i].flow++;
bj[S]=1;
ffl();
printf("%lld\n",ans1);
}
return 0;
}

【GDKOI2014】JZOJ2020年8月13日提高组T2 石油储备计划的更多相关文章

  1. 【GDKOI2014】JZOJ2020年8月13日提高组T4 内存分配

    [GDKOI2014]JZOJ2020年8月13日提高组T4 内存分配 题目 Description Input Output 输出m行,每行一个整数,代表输入中每次程序变化后系统所需要的空闲内存单位 ...

  2. 【GDKOI2014】JZOJ2020年8月13日提高组T3 壕壕的寒假作业

    [GDKOI2014]JZOJ2020年8月13日提高组T3 壕壕的寒假作业 题目 Description Input Output 输出n行.第i行输出两个整数,分别表示第i份作业最早完成的时刻以及 ...

  3. 【GDKOI2014】JZOJ2020年8月13日提高组T1 阶乘

    [GDKOI2014]JZOJ2020年8月13日提高组T1 阶乘 题目 Description Input 第一行有一个正整数T,表示测试数据的组数. 接下来的T行,每行输入两个十进制整数n和bas ...

  4. JZOJ2020年8月13日提高组反思

    JZOJ2020年8月13日提高组反思 T1 打了3h+,然后自己的小数据都没过 果断选择交对拍的暴力 下次还是注意时间吧 T2 一下三题都没时间打了 看了题目觉得特别烦人(有式子) 再看发现式子类似 ...

  5. JZOJ2020年8月11日提高组T2 宝石

    JZOJ2020年8月11日提高组T2 宝石 题目 Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是 ...

  6. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  7. 【佛山市选2013】JZOJ2020年8月7日提高组T2 树环转换

    [佛山市选2013]JZOJ2020年8月7日提高组T2 树环转换 题目 描述 给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1.树的节点编号从1开始.在 ...

  8. 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换

    [NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...

  9. JZOJ2020年8月11日提高组T4 景点中心

    JZOJ2020年8月11日提高组T4 景点中心 题目 Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个 ...

随机推荐

  1. [Luogu P2387] [NOI2014]魔法森林 (LCT维护边权)

    题面 传送门:https://www.luogu.org/problemnew/show/P2387 Solution 这题的思想挺好的. 对于这种最大值最小类的问题,很自然的可以想到二分答案.很不幸 ...

  2. python开发初识(一)

    python开发 机器码和字节码 机器码 :计算机可以直接认识的语言 字节码 :高级语言转换成机器码去执行 语言之间的对比: C,汇编 :C语言是根语言 python Java :既能写前端,又能写后 ...

  3. 【kata Daily 190905】What's a Perfect Power anyway?(完美幂)

    原题: A perfect power is a classification of positive integers: In mathematics, a perfect power is a p ...

  4. 10、Django与Ajax

    AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JS ...

  5. 8.字典dict和解构-封装

    字典dict 与列表的区别:列表可以存储大量的数据类型,但是只能按照顺序存储,数据与数据之间关联性不强 字典(dict)是python中唯⼀的⼀个映射类型.他是以{ }括起来的键值对组成. 字典中的键 ...

  6. 百度开源插件echarts介绍及如何使用

    前言 如果你想要用较少的代码实现比较酷炫的数据统计表,echarts是值得你考虑的一种实现方式.官网提供了很多实例供参考:http://echarts.baidu.com/examples.html. ...

  7. DB2添加联合主键

    CREATE TABLE EQUIPMENT_DAILY_CAL( EQU_DATE TIME NOT NULL ,/*日期*/ SEQ_ID INTEGER NOT NULL,/*序号 */ FAU ...

  8. .Net 5 正式版RTM 发布

    下载连接 https://dotnetcli.azureedge.net/dotnet/Sdk/5.0.100-rtm.20515.8/dotnet-sdk-5.0.100-rtm.20515.8-w ...

  9. QQ群web前端分析三——pageSpeed

    使用pageSpeed插件,试试页面分析,看看有没有什么问题.等会上图 第一个问题,大部分人使用默认图片,但是这个图片的url确不一样,导致重复请求了若干次,这个...., 第二个问题,图片没有指定默 ...

  10. @Autowired自动装配原理

    在类中为类名添加 @Auwowired注解,为该类在spring中注册成组件 1,先按照类型在容器中找对应的组件:找到一个, 直接赋值,一个都没找到, 抛异常 2,找到了多个:按变量名作为ID继续匹配 ...