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

点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. 未能加载文件或程序集“xxxx”或它的某一个依赖项

    一般是解决方案中相互依赖的项目生成的目标平台不一样所致,更改为相同目标即可!

  2. Oracle 日期计算

    日期相减,求天数 方法一: )),createdate from goods t

  3. 初试PL/SQL并行编程

    -----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...

  4. Sql Server Convert函数转换Datetime类型数据

    0 Feb 22 2006 4:26PM CONVERT(CHAR(19), CURRENT_TIMESTAMP, 0) 1 02/22/06 CONVERT(CHAR(8), CURRENT_TIM ...

  5. 如何让HTML的编写更具结构性

    首先声明,我不是搞技术的,很多词汇写的不够专业,但作为一枚菜鸟,我站在菜鸟的角度,来讲述我在学习技术的过程中所遇到的问题,和解决的方案. 入门HTML还算简单,无非是先写好固定的三对开闭标签结构:ht ...

  6. Linux新手笔记 svn ntfs

    centos 6.4 64 笔记一.安装Apache1.使用yum命令安装Apacheyum -y install httpd2.设置开机启动Apachechkconfig --levels 235 ...

  7. js得到分页栏

    自己写的,感觉返回html代码蠢蠢的,但是新手并不知道怎么写更好的,感觉这样子也蛮简单.记录下来,以后来越改越好. //获得分页栏.注意indexSize为奇数,这样也比较好看 //totalNum: ...

  8. 猪猪的机器学习笔记(十七)隐马尔科夫模型HMM

    隐马尔科夫模型HMM 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第十七次课在线笔记.隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来 ...

  9. Oracle中的EXCEPTION

    Oracle系统预定义的异常 比如:SELF_IS_NULL.VALUE_ERROR.ZERO_DIVIDE等Oracle中自带的异常类型 使用方法: DECLARE V_Result ); BEGI ...

  10. C# DES对称加密解密

    /// <summary> /// 加密 /// </summary> /// <param name="str"></param> ...