http://acm.hdu.edu.cn/showproblem.php?pid=4303

题意:
给出一棵树,树上的每一个节点都有一个权值,每条边有一个颜色,如果一条路径上相邻边的颜色都是不同的,那么它就是符合要求的。求出所有符合要求的路径上的节点的权值和。

思路:
num[u]表示u节点下有几条符合要求的子树路径,sum[u]表示u为起点(或者终点也可以)往子树方向符合要求的路径权值和。

如图,u的父节点颜色为1,u->v的边颜色为2,那么此时u可以和v相连,num[v]就是v保留的路径数,这些保留下来的都是和u->v颜色不同的,那么在原有的sum[v]上,因为有num[v]条路径,那么u节点可以连num[v]次,所以此时sum[u]+=sum[v]+num[v]*val[u], num[u]+=num[v]。

但是这样的话处理了u作为端点的情况,还存在一种情况就是u的两个子节点相连。这里可以用map来记录不同颜色的路径数和不同颜色的权值总和。统一处理即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int maxn = + ;
typedef long long ll; int n,tot;
int head[maxn], val[maxn],num[maxn];
ll sum[maxn];
ll ans; struct node
{
int v,col,next;
}e[*maxn]; void addEdge(int u,int v,int col)
{
e[tot].v = v;
e[tot].col = col;
e[tot].next = head[u];
head[u] = tot++;
} void dfs(int u,int fa,int prec)
{
num[u] = ;
sum[u] = val[u];
map<int,ll> mpNum, mpSum;
ll temp = , tempNum = , tempSum = ;
for(int i=head[u];i!=-;i=e[i].next)
{
int v = e[i].v;
int col = e[i].col;
if(v == fa) continue;
dfs(v,u,col);
temp = sum[v] + (ll)num[v]*val[u];
if(col != prec)
{
num[u] += num[v];
sum[u] += temp;
}
tempNum += num[v];
tempSum += temp;
mpNum[col] += num[v];
mpSum[col] += temp;
}
ans += tempSum;
temp = ;
for(int i=head[u];i!=-;i=e[i].next)
{
int v = e[i].v;
int col = e[i].col;
if(v == fa) continue;
temp += sum[v]*(tempNum - mpNum[col]) + num[v]*(tempSum - mpSum[col]);
}
ans += temp/;
} int main()
{
while(~scanf("%d",&n))
{
ans = ;
tot = ;
memset(head,-,sizeof(head));
for(int i=;i<=n;i++) scanf("%d",&val[i]);
for(int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
addEdge(v,u,w);
}
dfs(,,);
printf("%lld\n",ans);
}
return ;
}

最新文章

  1. Web前端之复选框选中属性
  2. atom 折腾记(转载的)
  3. a byte of python(摘04)
  4. Dephi的同一个线程支持累次Execute吗
  5. ExtJs之文本框及数字输入
  6. 【转】C++及java在内存分配上的区别
  7. AutoTile 自动拼接(四) 学习与实践
  8. [Leetcode]50. Pow(x, n)
  9. springMVC源码分析--HandlerInterceptor拦截器(一)
  10. UVA437-The Tower of Babylon(动态规划基础)
  11. java限制map大小,并FIFO淘汰
  12. Web前端(整理不好,自己未学)
  13. Oracle Dynamic Performance Views Version 12.2.0.1
  14. LVS原理详解(3种工作模式及8种调度算法)
  15. CSDN极客头条使用指南
  16. Flex知识
  17. PhpStorm (强大的PHP开发环境)2017.3.2 附注册方法
  18. [译]用R语言做挖掘数据《二》
  19. layui使用 ——父,子页面传值
  20. Recursive functions and algorithms

热门文章

  1. 转:C#判断ContextMenuStrip右键菜单的来源(从哪个控件弹出来的)
  2. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
  3. RHEL7 CentOS7 的 firewall命令简单介绍
  4. kali linux 压缩文件解压缩命令(包含7z)
  5. java类中使用quartz,设置自动任务Demo
  6. Java笔记 #04# 类的初始化顺序补充
  7. 给PXC集群加密
  8. linux中权限对文件和目录的意义
  9. 【题解】luogu P3386 【模板】二分图匹配
  10. Android之RadioButton多行