题目传送门

 /*
题意:寻找一个根节点,求min f(u) = ∑ρ(v, u) * p(v)。ρ(v, u)是u到v的距离,p(v)是v点的权值
树形DP:先从1出发遍历第一次,sum[u]计算u到所有子节点v的路径权值(之后的点路径有叠加,所以先把路径权值加后*w),
计算f[u](缺少u节点以上的信息)。然后再遍历一遍,之前是DFS从下往上逆推,现在是顺推,把u节点以上的信息加上
dp的部分不是很多,两个DFS函数想了很久,还是没完全理解:(
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; typedef long long ll;
const int MAXN = 1e5 + ;
const int INF = 0x3f3f3f3f;
int p[MAXN];
ll f[MAXN];
ll sum[MAXN];
vector<pair<int, int> > G[MAXN]; void DFS1(int u, int rt)
{
f[u] = ; sum[u] = p[u];
for (int i=; i<G[u].size (); ++i)
{
int v = G[u][i].first; int w = G[u][i].second;
if (v == rt) continue;
DFS1 (v, u);
f[u] += f[v] + sum[v] * w; sum[u] += sum[v];
}
} void DFS2(int u, int rt)
{
for (int i=; i<G[u].size (); ++i)
{
int v = G[u][i].first; int w = G[u][i].second;
if (v == rtGym 100496H House of Representatives) continue;
f[v] = f[u] - sum[v] * w + (sum[u] - sum[v]) * w;
sum[v] = sum[u];
DFS2 (v, u);
}
} int main(void) //Gym 100496H House of Representatives
{
// freopen ("H.in", "r", stdin);
freopen ("house.in", "r", stdin);
freopen ("house.out", "w", stdout); int n;
while (scanf ("%d", &n) == )
{
for (int i=; i<=n; ++i) scanf ("%d", &p[i]);
for (int i=; i<=n; ++i) G[i].clear (); for (int i=; i<=n-; ++i)
{
int u, v, w; scanf ("%d%d%d", &u, &v, &w);
G[u].push_back (make_pair (v, w));
G[v].push_back (make_pair (u, w));
} DFS1 (, -); DFS2 (, -); int p = ;
for (int i=; i<=n; ++i)
{
if (f[i] < f[p]) p = i;
} printf ("%d %I64d\n", p, f[p]);
} return ;
}

最新文章

  1. java类的加载机制
  2. springboot之HelloWorld
  3. linux centos使用xrdp远程界面登陆
  4. CommonJS规范
  5. [ActionScript 3.0] 根据xml属性查找相应xml节点,递归函数。
  6. DOS下更改编码方式
  7. iconv gbk字符转utf8字符
  8. JQuery__Tab实践
  9. C#与C++中struct和class的小结
  10. Excel 按模板格式导出
  11. 读书笔记 effective c++ Item 49 理解new-handler的行为
  12. js判断元素滑动方向(上下左右)移动端
  13. hexo next主题为博客添加分享功能
  14. Netbeans IDE 安装Emmet插件并解决Emmet插件无效果问题
  15. Could not transfer artifact org.springframework
  16. 软件项目管理:什么是baseline
  17. 解剖android中的闹钟app 一
  18. java基础----&gt;多线程之synchronized(六)
  19. linux命令汇总1
  20. canvas实现点击带水纹的按钮

热门文章

  1. 常见问题:Linux安装Python3步骤、Windows无法利用pip
  2. MSDN 同步部分 个人笔记
  3. Being a Good Boy in Spring Festival 博弈论 Nim博弈
  4. mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list&lt;对应的object&gt;就行了啊
  5. registerServiceWorker创建的React项目中的registerServiceWorker作用?
  6. 008 frame relay
  7. CentOS 5.11开启VNC Service
  8. C#.NET如何判断是否有缺少的using
  9. 使用Charles进行网络抓包
  10. mysql查看所有存储过程,函数,视图,触发器,表