hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/**
题目: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 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。的更多相关文章
- HDU-6035 Colorful Tree(树形DP) 2017多校第一场
题意:给出一棵树,树上的每个节点都有一个颜色,定义一种值为两点之间路径中不同颜色的个数,然后一棵树有n*(n-1)/2条 路径,求所有的路径的值加起来是多少. 思路:比赛的时候感觉是树形DP,但是脑袋 ...
- URAL_1018 Binary Apple Tree 树形DP+背包
这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...
- 熟练剖分(tree) 树形DP
熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...
- HDU6035:Colorful Tree(树形DP)
传送门 题意 给出一棵最小生成树及每个节点的颜色,询问\(\frac{n(n-1)}2\)条路径的权值和,一条路径的权值为该路径的颜色种数 分析 勉强理解了ftae的做法,但是代码还是不太会,还是太弱 ...
- 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 ...
- Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)
题目:http://codeforces.com/contest/1153/problem/D 题意:给你一棵树,每个节点有一个操作,0代表取子节点中最小的那个值,1代表取子节点中最大的值,叶子节点的 ...
- BZOJ4987:Tree(树形DP)
Description 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一行两个正整数n,k,表示数的顶点数和需要 ...
- HDU5834 Magic boy Bi Luo with his excited tree (树形DP)
题意:一棵树有点权和边权 从每个点出发 走过一条边要花费边权同时可以获得点权 边走几次就算几次花费 点权最多算一次 问每个点能获得的最大价值 题解:好吧 这才叫树形DP入门题 dp[i][0]表示从i ...
- 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 ...
随机推荐
- js文件加载执行顺序
转自:http://blog.163.com/water_down/blog/static/170276590201111711243458/ <script type="text/j ...
- eclipse中使用mybatis-generator逆向代码生成工具问题解决记录
问题一: eclipse中使用mybatis-generator逆向代码生成工具出现waiting for "building workspace" 解决办法: 选择菜单栏的 ...
- M.U.G.E.N Error怎么办
当运行乱舞格斗2008的时候出现以下错误. 在任务管理器中找到M.U.G.E.N.exe这个进程,右击设置相关性,然后取消勾选其中一个,点击确定. 不要关闭这个窗口,否则M.U.G.E.N这个进程也将 ...
- android wifi调试(无线调试) 一步到位
没有数据线时候,怎么进行调试开发?只要在一个局域网内,最好选择wifi调试! 网上有很多这样的教程,但是有很多步.很繁琐.最近我在gp上下载了一个软件可以实现点击一步就可以了.不需要在手机上输入任何命 ...
- ASUS主板ALC887声卡,RTL81XX网卡,黑苹果驱动安装
折腾了一下午终于在黑苹果上成功的安装了网卡,声卡驱动: 我的配置: 主板 ASUS b75m-a 声卡 ALC887 网卡 RTL8168F 安装所需工具: MutiBest 下载OS对应的版本即可 ...
- php使用curl请求数据(采集数据)
<?php $url = "http://www.baidu.com/s?wd=刘俊涛的博客"; $header = array( 'User-Agent: Mozilla/ ...
- oracle update left join查询
对于有的更新语句,要更新的表可能条件不够,需要用到left join关联其他表, 但是不能直接关联,否则报错:错误如下: update imim_gireqbillitems gi left join ...
- 网站缓存技术(Redis、Memcached、Ehcache)
Redis 是什么? 通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等等. 分类的标准也不一,Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点 ...
- angular开发中对请求数据层的封装
代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...
- Google两步验证安装使用方法
http://www.williamlong.info/archives/2754.html