BZOJ 1827 奶牛大集会
2016-07-11 17:29
435 查看
树型DP。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 200500 #define maxe 300500 #define inf 1000000007 using namespace std; long long n,x,y,z,c[maxv],nume=0,g[maxv],val[maxv],sum=0,ans,dis[maxv]; struct edge { long long v,w,nxt; }e[maxe]; void addedge(long long u,long long v,long long w) { e[++nume].v=v; e[nume].w=w; e[nume].nxt=g[u]; g[u]=nume; } void dfs1(long long x,long long fath) { val[x]=c[x]; for (long long i=g[x];i;i=e[i].nxt) { long long v=e[i].v; if (v!=fath) { dis[v]=dis[x]+e[i].w; dfs1(v,x); val[x]+=val[v]; } } } void dfs2(long long x,long long fath,long long now) { for (long long i=g[x];i;i=e[i].nxt) { long long v=e[i].v; if (v!=fath) { long long re=now-val[v]*e[i].w+(sum-val[v])*e[i].w; ans=min(ans,re); dfs2(v,x,re); } } } int main() { scanf("%lld",&n); for (long long i=1;i<=n;i++) { scanf("%lld",&c[i]); sum+=c[i]; } for (long long i=1;i<=n-1;i++) { scanf("%lld%lld%lld",&x,&y,&z); addedge(x,y,z); addedge(y,x,z); } dfs1(1,1); for (long long i=1;i<=n;i++) ans+=c[i]*dis[i]; dfs2(1,1,ans); printf("%lld\n",ans); return 0; }
相关文章推荐
- 在jsp中用EL 表达来获取表单中的参数
- 2016上半年高项项目经理考试培训考试感想
- Myeclipse使用常见问题汇总
- js实现十六进制颜色值和rgb格式颜色值互转
- ipython notebook安装
- codeforces Helvetic Coding Contest 2016 D2 The Wall (medium)
- [从头读历史] 第298节 时间简史 关于黑洞的那些事
- Qt使用非阻塞事件循环的延时方式
- sublime text使用技巧
- Activity中弹软键盘
- mysql 数字字段的类型选择
- 关于AOP使用的自我总结
- 人力资源管理能否靠数字说话
- C语言的标准
- android 调用百度地图SDK,出现 not found the liblocSDK4d.so 解决方法
- Win10+Caffe+CUDA7.5编译
- UIKIT详解之UILabel全面解析
- GMPL 转成 MPS/LP for CPLEX/Gurobi
- Netty的入门-UDP协议开发
- android dp深度解析