题意:一棵树,给出每个点的权值和每条边的长度,

点j到点i的代价为点j的权值乘以连接i和j的边的长度。求点x使得所有点到点x的代价最小,输出

虽然还是不太懂树形DP是什么意思,先把代码贴出来把。

这道题目的做法是:先进行一次DFS,以每个节点为根,求出它下面节点到它的数量和。

再进行一次DFS,以每个节点为根,求出它下面节点到它的花费总和。

source code:

#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define ll long long
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
using namespace std; const int INF = 0x3f3f3f3f;
const int MAXN = ; struct edge{
int v, w;
edge(){}
edge(int a, int b) : v(a), w(b){}
}; vector <edge> node[MAXN];
int n,sum[MAXN],a[MAXN];
//a[MAXN]表示每一个节点的权值,sum[MAXN]表示子树的权值和
ll dist[MAXN];
bool vis[MAXN]; void init(){
for(ll i = ; i <= n; ++i)
node[i].clear();
memset(vis, , sizeof(vis));
memset(dist,,sizeof(dist));
} void dfs(ll u,ll dis){
vis[u] = true;
dist[] += dis * a[u];
sum[u] = a[u];
ll size = node[u].size();
for(ll i = ; i < size; ++i){
ll v = node[u][i].v;
if(vis[v]) continue;
dfs(v, dis + node[u][i].w);
sum[u] += sum[v];
}
} void dfs1(ll u){
vis[u] = true;
ll size = node[u].size();
for(ll i = ; i < size; ++i){
ll v = node[u][i].v;
ll w = node[u][i].w;
if(vis[v]) continue;
dist[v] = dist[u] - sum[v] * w + (sum[] - sum[v]) * w;
//dist[v] = dist[u] + (sum[1] - 2 * sum[v]) * w;
dfs1(v);
}
} int main(){
ll i, j, x, y, w;
while(EOF != scanf("%I64d",&n)){
init();
for(i = ; i <= n; ++i) scanf("%I64d",&a[i]);
for(i = ; i < n; ++i){
scanf("%I64d %I64d %I64d",&x,&y,&w);
node[x].push_back(edge(y,w));
node[y].push_back(edge(x,w));
}
dfs(,);
memset(vis,,sizeof(vis));
dfs1();
ll ans = dist[];
for(i = ; i <= n; ++i){
ans = min(ans, dist[i]);
}
cout << ans << endl;
//printf("%I64d\n",ans);
}
return ;
}

HDU 3899 简单树形DP的更多相关文章

  1. hdu 1520(简单树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 思路:dp[u][0]表示不取u的最大价值,dp[u][1]表示取u的最大价值,于是有dp[u] ...

  2. hdu 1520Anniversary party(简单树形dp)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

  4. hdu 1054 Strategic Game (简单树形DP)

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. HDU 2089 简单数位dp

    1.HDU 2089  不要62    简单数位dp 2.总结:看了题解才敲出来的,还是好弱.. #include<iostream> #include<cstring> #i ...

  6. poj 2342 Anniversary party 简单树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3862   Accepted: 2171 ...

  7. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  8. HDU 3853LOOPS(简单概率DP)

    HDU 3853    LOOPS 题目大意是说人现在在1,1,需要走到N,N,每次有p1的可能在元位置不变,p2的可能走到右边一格,有p3的可能走到下面一格,问从起点走到终点的期望值 这是弱菜做的第 ...

  9. hdu4705 Y 简单树形DP 2013多校训练第十场 J题

    题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...

随机推荐

  1. QT小技巧—更好管理项目(增加预编译头文件,并且指定moc文件的生成位置)good

    预编译加速编译 QT也可以像VS那样使用预编译头文件来加速编译器的编译速度.首先在.pro文件中加入: CONFIG += precompiled_header 然后定义需要预编译的头文件: PREC ...

  2. 软件包管理_rpm命令管理_yum工具管理_文件归档压缩_源码包管理

    rpm命令管理软件 对于挂载的像U盘那种都会在midea目录下,但是会显示在桌面上 安装软件(i:install,v:verbose冗长的,h:human):rpm  -ivh  xxxx.rpm 安 ...

  3. AES 加密

    package com.sprucetec.tms.utils; import java.security.Key; import javax.crypto.Cipher;import javax.c ...

  4. sed(查找替换) 与awk(提取字段)

    通常: sed 处理列  awk处理行 比较方便 Sed是一个基本的查找替换程序     sed -i   "s/^@//g"     文件  #原地操作原文件,进行替换 cat ...

  5. java学习之即时通信项目实战

     项目总结:这次项目主要是根据视频来的,结果跟到一半感觉跟不上,慢慢自己有了自己的想法,决定自己先不看学习视频,自己先试着写. 总结写前面,算是写的第一个项目吧.项目中遇到几点问题,首先Scoket对 ...

  6. 关于SpringMVC中找不到<mvc:resources/>标签的解决办法

    在springMVC中我们经常会用到<mvc:resources/>标签,但是有些编辑器中的schema过于陈旧.导致找不到<mvc:resources/>标签. 经过试验,有 ...

  7. 面试之get和post(转)

    总结1 表单提交中get和post方式的区别归纳如下几点: GET是从服务器上获取数据,POST是向服务器传送数据,GET 请求一般不应产生副作用.就是说,它仅仅是获取资源信息,就像数据库查询一样,不 ...

  8. POJ 2250 Compromise(LCS)

    POJ 2250 Compromise(LCS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#proble ...

  9. win7如何快速设置开机启动项?

    添加开机启动项方法: 找到windows开始菜单->所有程序->启动,右键打开, 进入C:\Users\Ocean\AppData\Roaming\Microsoft\Windows\St ...

  10. winsock2获取网页

    #define WIN32_LEAN_AND_MEAN#include <winsock2.h>#include <stdlib.h>#include <stdio.h& ...