【时光回溯】【JZOJ3567】【GDKOI2014】石油储备计划
2016-09-25 09:13
211 查看
题目描述
输入
输出
对于每组数据,输出一个整数,表示达到“平衡”状态所需的最小代价。样例输入
23
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
样例输出
44
数据范围
对于20%的数据,N<=15对于100%的数据,T<=10,N<=100,0<=si<=10000,1<=X,Y<=N,1<=Z<=10000。
样例解释
对于第一组数据,从城市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,是能达到的所有状态的最小值。
解法
显然分配的桶数有(sum%n)个(sum/n+1)桶,其他都是sum/n个桶。设f[i][j]为在i为根的子树中,放了j个(sum/n+1)桶。
这样对于这棵以i为根的子树,桶的总数是一定的,设为x;然后i与其父亲的流量显然是x-原桶数。
而一条边的贡献=流量*这条边的长度。
答案又是所有边的贡献之和。
所以给状态转移提供了条件。
没有必要把原树转化为二叉树。
题解还提供了网络流做法;以及二叉树形动态规划的做法。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define ll long long #define sqr(x) ((x)*(x)) #define ln(x,y) ll(log(x)/log(y)) using namespace std; const char* fin="ex3567.in"; const char* fout="ex3567.out"; const ll inf=0x7fffffff; const ll maxn=107,maxm=maxn*2; ll t,n,m,m1,i,j,k,l,tot,INF; ll fi[maxn],ne[maxm],la[maxm],a[maxn],va[maxm]; ll f[maxn][maxn],si[maxn],sum[maxn]; ll g[maxn][maxn][maxn]; void add_line(ll a,ll b,ll c){ tot++; ne[tot]=fi[a]; la[tot]=b; va[tot]=c; fi[a]=tot; } void dfs(ll v,ll from){ ll i,j,k,l=0; g[v][l][0]=0; g[v][l][1]=0; si[v]=1; sum[v]=a[v]; for (k=fi[v];k;k=ne[k]){ if (la[k]!=from){ dfs(la[k],v); si[v]+=si[la[k]]; sum[v]+=sum[la[k]]; for (i=0;i<=m;i++){ if (f[la[k]][i]>=INF) continue; for (j=m-i;j>=0;j--){ if (g[v][l][j]>=INF) continue; g[v][l+1][j+i]=min(g[v][l+1][j+i],g[v][l][j]+f[la[k]][i]+abs(sum[la[k]]-i*(m1+1)-(si[la[k]]-i)*m1)*va[k]); } } l++; } } for (i=0;i<=m;i++) f[v][i]=g[v][l][i]; } int main(){ scanf("%d",&t); for (;t;t--){ scanf("%d",&n); memset(fi,0,sizeof(fi)); memset(f,127,sizeof(f)); memset(g,127,sizeof(g)); INF=g[0][0][0]; tot=0; k=0; for (i=1;i<=n;i++) scanf("%d",&a[i]),k+=a[i]; m=k%n; m1=k/n; for (i=1;i<n;i++){ scanf("%d%d%d",&j,&k,&l); add_line(j,k,l); add_line(k,j,l); } dfs(1,0); //f[1][m]=-f[1][m]; printf("%lld\n",f[1][m]); } return 0; }
启发
树形动态规划的必要条件之一:设置的状态可以确定一棵子树所提供的贡献,从而可以进行转移。
相关文章推荐
- GDKOI2014 石油储备计划
- 【时光回溯】【JZOJ3566】【GDKOI2014】阶乘
- 【时光回溯】【JZOJ3568】【GDKOI2014】小纪的作业题
- 【时光回溯】【JZOJ3571】【GDKOI2014】内存分配
- jzoj3555 【GDKOI2014模拟】树的直径 lca+离线
- JZOJ 3804. 【NOIP2014模拟8.24】小X 的AK 计划
- 12.23 jzoj3566. 【GDKOI2014】阶乘
- [jzoj]3555. 【GDKOI2014模拟】树的直径(结论题-树的性质)
- JZOJ B组【GDKOI2014】阶乘
- [GDKOI2014][JZOJ3572]基因模式
- 2014 新年计划
- 学习计划_一周一结(2014)
- 2014读书计划
- 2013总结-2014计划
- JZOJ 3766. 【BJOI2014】大融合
- [jzoj]3541. 【清华集训2014】破冰派对(组合数+思维)
- 2014总结与2015年计划
- JZOJ 3823. 【NOIP2014模拟9.9】遇见
- JZOJ__Day 10:【普及模拟】【USACO】贝茜的晨练计划
- 【JZOJ2700】【GDKOI2012模拟02.01】数字