题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3899

思路:num[u]表示u以及u的子树的队伍数的总和,dist[u]表示u到根节点的距离,dp[u]表示以u为根时的总花费。我们可以先做一次dfs算出树上所有点到根节点(1)的花费总和,然后同时计算出num[],然后就是又一次dfs算出以每个点为根的话费,这里有dp[v]=dp[u]+(sum-num[v])*w-num[v]*w(其中u是v的根)。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 100100
typedef long long LL;
#pragma comment(linker, "/STACK:1024000000,1024000000") struct Edge{
int v,w;
Edge(int vv,int ww):v(vv),w(ww){}
}; int n;
int num[MAXN],sum;
LL dp[MAXN],dist[MAXN],ans;
vector<vector<Edge> >G; void dfs1(int u,int father)
{
for(int i=;i<G[u].size();i++){
int v=G[u][i].v,w=G[u][i].w;
if(v==father)continue;
dist[v]=dist[u]+w;
ans+=(LL)num[v]*dist[v];
dfs1(v,u);
num[u]+=num[v];
}
} void dfs2(int u,int father)
{
for(int i=;i<G[u].size();i++){
int v=G[u][i].v,w=G[u][i].w;
if(v==father)continue;
dp[v]=dp[u]+(LL)(sum-num[v])*w-(LL)num[v]*w;
dfs2(v,u);
}
} int main()
{
int u,v,w;
while(~scanf("%d",&n)){
G.clear();
G.resize(n+);
sum=;
for(int i=;i<=n;i++){
scanf("%d",&num[i]);
sum+=num[i];
}
for(int i=;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
G[u].push_back(Edge(v,w));
G[v].push_back(Edge(u,w));
}
dist[]=;
ans=;
dfs1(,-);
memset(dp,,sizeof(dp));
dp[]=ans;
dfs2(,-);
// cout<<ans<<"**"<<endl;
for(int i=;i<=n;i++){
ans=min(ans,dp[i]);
// cout<<dp[i]<<"***"<<endl;
}
printf("%I64d\n",ans);
}
return ;
}

最新文章

  1. CSS之深入探究Position
  2. myeclipse 破解
  3. 基于springMVC+angular+bootstrap+mysql的简易购物网站搭建
  4. ionic cordova 热更新(引用自www.zyyapp.com/post/116.html)
  5. Cloudera5.8.3:Flume+Morphline+Solr开发小技巧
  6. 15款效果很酷的最新jQuery/CSS3特效
  7. jq 中each的用法
  8. [转载]Android开发必备的21个免费资源和工具
  9. 一张图看懂dex
  10. OC 动态类型和静态类型
  11. 二、Windows基础数据类型
  12. python识别html主要文本框
  13. 机器学习之Logistic 回归算法
  14. Sql的基础知识技巧(三)
  15. java内部类(一)
  16. 【Python】【运算符】
  17. cropper实现基本的裁剪图片并上传
  18. python学习笔记13-集合set
  19. HMM模型和Viterbi算法
  20. mongdb的聚合管道

热门文章

  1. PHP - MAC下PhpStorm安装调试环境xdebug
  2. PHP-根据字符串和所用字体计算字符串所占宽高
  3. 【翻译】Android多线程下安全访问数据库
  4. 温故而知新 js 点击空白处关闭气泡
  5. 自己是个菜鸟 自己查找的简单的适合初学的Makefile
  6. 5.1 Zend_Log_Writer
  7. Nokia Imaging SDK滤镜使用入门
  8. 怎么使用Less/Sass编译工具koala
  9. Redis 面试题(持续更新)
  10. C++虚函数解析(转载)