/**
题目:hdu6035 Colorful Tree
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035
题意:给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。 思路:看题解后,才想出来的。树形dp。 求所有路径的值和 = 路径条数*总颜色数(n*(n-1)*colors/2)-sigma(每种颜色没有经过的路径条数) 主要是求每种颜色没有经过的路径条数。 画一棵树,我直接用颜色值表示节点编号。 2
/ \
3 4
/ / \
1 3 2
/ \ / \ / \
4 5 4 5 3 5 12个点。 首先求颜色值为3的不经过的路径条数x
树上有三个3.很容易想到:
x = 最左边那个3下面的3个点构成的路径条数(3*2/2=3)+中间的3的两个子树分别构成的路径条数和(0)
+最右边的3的子树的分别构成的路径条数和(0)
+(总节点数-所有的3为根的子树节点数之和)*(总节点数-所有的以3为根的子树节点数之和-1)/2 ; 所以size[i]表示以i为根的树的节点数。 sum[i]在dfs过程中,,维护。。比如假设颜色为2.上图。 那么左子树是根为3,右子树是根为4.
那么递归完左子树之后,sum[2] = 0; 然后再递归完右子树后sum[2] = 3;就是右下角的那个2为根的子树的点数。 最终sum[i]表示所有以i颜色为根的子树的所有节点数之和。
sum[2] = 12;
sum[1] = 3;
sum[4] = 8;
sum[5] = 3;
sum[3] = 8; */ #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 2e5+;
int size[N];
int sum[N];
int col[N];
int vis[N];
int colors, n;
LL cnt;
vector<int> G[N];
void dfs(int r,int f)
{
int len = G[r].size(), temp = ;
size[r] = ;
if(sum[col[r]]!=){
temp = sum[col[r]];
sum[col[r]] = ;
}
for(int i = ; i < len; i++){
int to = G[r][i];
if(to==f) continue;
dfs(to,r);
size[r] += size[to];
cnt += (LL)(size[to]-sum[col[r]])*(size[to]-sum[col[r]]-)/;
sum[col[r]] = ;
}
sum[col[r]] = size[r]+temp;
}
int main()
{
int cas = ;
while(scanf("%d",&n)==)
{
memset(vis, , sizeof vis);
memset(size, , sizeof size);
memset(sum, , sizeof sum);
colors = ;
for(int i = ; i <= n; i++) G[i].clear();
for(int i = ; i <= n; i++){
scanf("%d",&col[i]);
if(vis[col[i]]==){
colors++;
}
vis[col[i]] = ;
}
int u, v;
for(int i = ; i <= n-; i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
cnt = ;
dfs(,-);
for(int i = ; i <= n; i++){
if(vis[i]==) continue;
cnt += (LL)(n-sum[i])*(n-sum[i]-)/;
}
printf("Case #%d: %lld\n",cas++,(LL)n*(n-)/*colors-cnt);
}
return ;
}

hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。的更多相关文章

  1. HDU-6035 Colorful Tree(树形DP) 2017多校第一场

    题意:给出一棵树,树上的每个节点都有一个颜色,定义一种值为两点之间路径中不同颜色的个数,然后一棵树有n*(n-1)/2条 路径,求所有的路径的值加起来是多少. 思路:比赛的时候感觉是树形DP,但是脑袋 ...

  2. URAL_1018 Binary Apple Tree 树形DP+背包

    这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...

  3. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  4. HDU6035:Colorful Tree(树形DP)

    传送门 题意 给出一棵最小生成树及每个节点的颜色,询问\(\frac{n(n-1)}2\)条路径的权值和,一条路径的权值为该路径的颜色种数 分析 勉强理解了ftae的做法,但是代码还是不太会,还是太弱 ...

  5. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  6. Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)

    题目:http://codeforces.com/contest/1153/problem/D 题意:给你一棵树,每个节点有一个操作,0代表取子节点中最小的那个值,1代表取子节点中最大的值,叶子节点的 ...

  7. BZOJ4987:Tree(树形DP)

    Description 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一行两个正整数n,k,表示数的顶点数和需要 ...

  8. HDU5834 Magic boy Bi Luo with his excited tree (树形DP)

    题意:一棵树有点权和边权 从每个点出发 走过一条边要花费边权同时可以获得点权 边走几次就算几次花费 点权最多算一次 问每个点能获得的最大价值 题解:好吧 这才叫树形DP入门题 dp[i][0]表示从i ...

  9. hdu 5834 Magic boy Bi Luo with his excited tree 树形dp+转移

    Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 13107 ...

随机推荐

  1. 【云计算】Docker容器时间同步如何配置?

    示例: # 3.8 配置时区.时钟同步 # configure timezone & ntp RUN echo ${TIME_ZONE} > /etc/timezone \ && ...

  2. OC中数组的使用方法

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) {     // 创建数组     NS ...

  3. X5平方速算法的证明

    X5代表15,25,35,45,55......以上变化的部分为X,如25这个数,X就等于2. X5平方数的速算法是这样:让X乘以X+1,后面写上25就是X5乘以X5的结果.比如25x25,先让2x3 ...

  4. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何声明定时器,使用定时器TON模块 TC3

    TON功能块功能: 当输入为高电平时,计时器开始计时,CV表示计时器计时的当前值,而PV则是计时的目标值,当CV的值等于PV的值时,输出置1.     在主程序接下去的地方按下F2并添加TON功能块. ...

  5. thinkphp 表名 大小写 窍门

    我们有一个表auth_group_access,那么如何使用呢?在使用M方法时,对于带下划线的表名,可以采用如下方法. M('AuthGroupAccess');对应sql语句SQL: SHOW CO ...

  6. JMX 学习

    http://blog.csdn.net/qiao000_000/article/category/763467

  7. JavaScript经常使用代码段

    把例如以下代码增加<body>区域中: 后退 前进 <!--<input type="button" value="后退" onClic ...

  8. HTML-HTML5+CSS3权威指南阅读(四、媒体查询)

    1.媒体类型 HTML 4和CSS 2目前支持为不同的媒体类型设定专有的样式表, 比如, 一个页面在屏幕上显示时使用无衬线字体, 而在打印时则使用衬线字体, screen 和 print 是两种已定义 ...

  9. 安装python3.6后使用pip报错

    安装python3.6后,pip是一起安装好的,安装目录再C:\Programs\Python\Python36-32\Scripts中. 在python终端模式下使用pip出现错误如下: 错误原因: ...

  10. 利用docker创建支持centos的ssh镜像

    创建docker镜像需要基础镜像,目前官方已提供了多种基础镜像,参见: https://hub.docker.com/explore/ 要想创建支持centos的ssh镜像,就需要以centos镜像为 ...