思路
默认以1为根节点进行dfs遍历。
dp[i][0]表示在以i为根节点的子树中,且与i的连边为类型 B 的所有路径中最长的。dp[i][1]表示以i为根节点的子树中,与i的连边为类型 R 的所有路径中最长的。那从前面两个dp我们可以知道以i为根节点,且选择了节点i的最长路径肯定是dp[i][0]+dp[i][1]。那假如我们讨论了所有子树,那么最长路径也肯定知道了。
现在问题在于如何得到所有节点的dp值呢。我们发现假如我们知道了一个节点u的所有子节点v的dp值,那么u的dp值也就知道了。因为节点u的dp[u][x]=max(dp[v][x⊕1]+1).所以我们需要先知道所有子节点的dp值,再用子节点的dp值去更新父节点。这个我们用dfs去处理。
代码