题意:
给定一棵树,树上每个结点都有一种颜色,询问路上任意两点之间的路径上包含的不同颜色数目和。
思路:
正着求不好求,先认为所有的路径上包含所有出现过的颜色,那么只需要减去每个颜色没有出现过的路径之和。
官方题解:
单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和。反过来思考只需要求有多少条路径没有经过这种颜色即可。直接做可以采用虚树的思想(不用真正建出来),对每种颜色的点按照 dfs 序列排个序,就能求出这些点把原来的树划分成的块的大小。这个过程实际上可以直接一次 dfs 求出。
代码: