题目大意:
给你一棵n(2<=n<=200000)个节点的每个节点有一个颜色的树,求树上所有路径经过的颜色数的和。
解题思路:
首先分开考虑每种颜色,也就是拆成n棵只存在当前枚举的颜色,其他颜色视为无色的树。那么就变成了求所有路径中经过这种颜色的路径数,这样还是不好求,再转化一下,如果我们知道所有路径中没有经过这种颜色的路径数也可以算出答案。
对于求没有进过这个颜色的路径数,我们可以把这棵树上这种颜色的点删掉,就得到了一些联通块,每个联通块中的全部路径都是要求的。于是就可以对每棵树dfs一遍,得到结果,时间复杂度是O(N*N),显然会TLE。
继续优化,可以发现,在dfs的过程中,我们只关心和当前节点颜色相同的节点,于是我们就可以考虑使用虚树,也就是不用真的把原树拆开,我们只需要同时维护所有颜色的信息,在dfs到一个节点是只使用和更新当前颜色的信息即可。这样就可一遍dfs解决所有问题,时间复杂度就减为O(N),十分完美。
AC代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
你可能感兴趣的:(算法,图论)