分析:一眼树形dp题,就是不会写QAQ.树形dp嘛,定义状态肯定有一维是以i为根的子树,其实这道题只需要这一维就可以了.设f[i]为以i为根的子树中的权值和.先处理子树内部的情况,用一个数组son[i]表示以i为根的子树中,i能走到的节点个数,可以利用son数组和当前点的权值来更新f数组.

处理了每个子树内部的情况,接下来就要合并它们,将每一个根节点作为中间点,算一下中间点权值的贡献,利用乘法原理算出有多少对点对经过中间点,乘一下就ok了.

树形dp的基本状态定义要熟记,有些题目子树内部是互相独立的,可以在子树里面单独计算,最后再合并一下.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ; int n, a[maxn], head[maxn], to[maxn * ], nextt[maxn * ], tot = , w[maxn * ];
long long ans, f[maxn], son[maxn]; void add(int x, int y, int z)
{
w[tot] = z;
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(int u, int fa, int col)
{
long long res = ;
f[u] = a[u];
son[u] = ;
bool flag = ;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (v == fa)
continue;
dfs(v, u, w[i]);
if (col != w[i])
{
flag = ;
son[u] += son[v];
f[u] += son[v] * a[u] + f[v];
}
res += son[v] * a[u] + f[v];
}
ans += res;
if (flag)
return;
for (int i = head[u]; i; i = nextt[i])
{
int v1 = to[i];
if (v1 != fa)
for (int j = i; j; j = nextt[j]) //防止重复统计,所以j=i而不是j=head[u]
{
int v2 = to[j];
if (v2 != fa && w[i] != w[j])
ans += son[v1] * f[v2] + son[v2] * f[v1] + a[u] * son[v1] * son[v2];
}
}
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
for (int i = ; i < n; i++)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
add(y, x, z);
}
dfs(, , );
printf("%lld\n", ans); return ;
}

最新文章

  1. ajax同步异步问题
  2. 使用DOSBox在Win7_x64下搭建汇编环境
  3. ubuntu下常用服务器的构建
  4. [转]Java获取当前路径
  5. Yii 框架中带有区间的搜索
  6. 解决jQuery插件重名问题
  7. ON DUPLICATE KEY UPDATE 当记录不存在时插入,当记录存在时更新
  8. c++ 07
  9. 面向对象程序设计-C++ Finial exam review NOTES【第十六次上课笔记】
  10. rest-work-eat-study-rest-work-eat or rest-rest-work-work-eat-eat..
  11. find the greatest common divisor
  12. 【Centos】yum 安装mariaDB
  13. 复用代码【SSH配置文件】
  14. 怎么解决dede首页网址自动加上index.html
  15. 2java判断素数
  16. 使用RxSwift 实现登录页面的条件绑定
  17. 自定义Write节点的beforerender属性
  18. jenkins进阶-集成钉钉机器人(6)
  19. kotlin使用anko在Android中实现Activity跳转,超优雅!
  20. World Cup(思维+模拟)

热门文章

  1. JSP-Runoob:JSP 调试
  2. codevs1557 热浪(堆优化dijkstra)
  3. 什么是JavaScript对象?
  4. 一款超好用的第三方评论插件--Gitalk
  5. linux命令(006) -- w
  6. Offer收割_5
  7. [Windows Server 2012] MySQL安全加固
  8. 【译】x86程序员手册17-第6章保护
  9. 排序算法JavaScript版
  10. centos7 安装zabbix3.4