HDU 6035 Colorful Tree [树形dp]

题意:给一颗树,定义树上路径u到v的价值为路径上不同颜色的节点的数量,问所有路径的总价值为多少

题解:根据题意,所需要求解的价值可以转换为,假设每条路径上包含所有的颜色,也就是n*(n-1)/2*(总颜色个数),然后减去每个颜色对不存在这个颜色的的所有路径的贡献。

dfs树上的每一个节点,对于当前节点,我们对每一个子树,用sum数组记录每一个颜色的截断值,于是这个子树的size-父节点颜色的截断值 来表示该子树与父节点颜色不同的连通块的总个数。

AC代码:

#include
#include
#include
#define N 200005
using namespace std;
typedef long long ll;
ll col[N],size[N];
ll mark[N];
vectorvt[N];
ll sum[N];
ll ans=0;
void dfs(ll u,ll fa)
{
	ll all=0;
	size[u]=1;
	for(ll i=0;i


你可能感兴趣的:(HDU,树形dp)