hdu 6035(树形dp)
题意:给你棵树,树上每个节点都有颜色,每条路径上有m种颜色 问你所有路径上出现的颜色的和
思路:答案求的是每种颜色对路径的贡献 我们可以反过来每种颜色不经过的路径的条数
假设根节点的颜色为x 我们就可以知道不过x颜色的路径一定不经过这个根节点 和不经过这个子树中颜色为x的节点
所有树形dp。。。。。。。

son[u]统计的是以u的根节点的子树的大小 节点的颜色为a[i] sum[a[i]]为在以i节点为根节点颜色a[i]的子树大小, 比如 1 8节点的颜色相同 x颜色没有经过的节点为1的儿子-sum[a[8]];
sum[a[8]]是可以在DFS中过程得到的 没有经过的点有y个 路径就有y*(y-1)/2;
所有我们在DFS一遍就能求出所有颜色没有经过的路径数目
答案就是所有的颜色经过所有的路径-所有的点没有经过的路径数目
我感觉dfs解释的有点牵强 具体看代码把 比较好理解
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string.h>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<cmath>
typedef long long ll;
typedef unsigned long long LL;
using namespace std;
const double PI=acos(-1.0);
const double eps=0.0000000001;
const int N=+;
int a[N],b[N];
int n,m;
int tot;
int head[N];
ll ans;
int son[N];
int sum[N];
struct node{
int to,next;
}edge[N<<];
void init(){
memset(head,-,sizeof(head));
memset(sum,,sizeof(sum));
tot=;
}
void add(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void DFS(int u,int fa){
son[u]=;
ll t=sum[a[u]];
ll c=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
DFS(v,u);
son[u]=son[v]+son[u];
ll temp=son[v]-(sum[a[u]]-t);
t=sum[a[u]];
c=c+temp;
ans=ans-(temp-)*temp/;
}
sum[a[u]]+=c+;
}
int main(){
int tt=;
while(scanf("%d",&n)!=EOF){
init();
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
ans=(ll)n*(n-)*n/;
DFS(,);
for(int i=;i<=n;i++){
ll temp=n-sum[i];
ans=ans-(temp-)*temp/;
}
printf("Case #%d: %lld\n", tt++, ans);
}
}
hdu 6035(树形dp)的更多相关文章
- HDU 6035(树形dp)
题意略. 思路:有n * (n - 1) / 2这么多边,要枚举是不可能的,感觉和数据结构也沾不上边.再加上树上染色,以一条边上不同颜色作为这个边的值,这看起来像是算贡献那种题,和17icpc沈阳的某 ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- HDU 1520 树形dp裸题
1.HDU 1520 Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...
- HDU 1561 树形DP入门
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 2196树形DP(2个方向)
HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...
- HDU 1520 树形DP入门
HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...
- codevs 1380/HDU 1520 树形dp
1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 回到问题 题目描述 Description Ural大学有N个职员 ...
- HDU 5834 [树形dp]
/* 题意:n个点组成的树,点和边都有权值,当第一次访问某个点的时候获得利益为点的权值 每次经过一条边,丢失利益为边的权值.问从第i个点出发,获得的利益最大是多少. 输入: 测试样例组数T n n个数 ...
- hdu 4267 树形DP
思路:先dfs一下,找出1,n间的路径长度和价值,回溯时将该路径长度和价值清零.那么对剩下的图就可以直接树形dp求解了. #include<iostream> #include<al ...
随机推荐
- spring data jpa方法命名规则
关键字 方法命名 sql where字句 And findByNameAndPwd where name= ? and pwd =? Or findByNameOrSex where name= ? ...
- [Python3网络爬虫开发实战] 5.2-关系型数据库存储
关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表,每一列是一个字段,每一行是一条记录.表可以看作某个实体的集合,而实体之间存在联系,这就需要表与表之 ...
- 2017 计蒜之道 初赛 第一场 B阿里天池的新任务(简单)
题链:"https://nanti.jisuanke.com/t/15500" 本来希望通过找循环节然后套KMP来通过后面题的,可是只过了B题,可能循环节不一定是存在的. #inc ...
- Java线程和多线程(一)——线程的基本概念
Java 线程是一个轻量级执行任务的处理单元.Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务. 在应用中存在两种类型的线程,用户线程和守护线程.当我们启动应 ...
- allegro中出光绘文件遇到问题的解决办法
一:设置好光绘文件参数后,选择check dabase before artwork后,点击生成光绘时出现错误告警信息: database has errors:artwork generati ...
- Lucene_Hello(示例)
(1)创建project (2)导入Lucene的核心包 (3)编写代码建立索引 /lucene01/src/cn/hk/lucene/TestIndex.java: package cn.hk.lu ...
- python +selenium的 里面还自带case 然后也有生成报告的模板
https://github.com/huahuijay/python-selenium2这个就是 python +selenium的 里面还自带case 然后也有生成报告的模板
- django2
八 Models 数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使用sqlit ...
- node.js 写流 createWriteStream----由浅入深
createWriteStream 写流 基于fs模块 let fs=require("fs"); createWriteStream创建一个写流 我们先创建一个2.txt要写入的 ...
- hdu_1028_Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...