默认以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去处理。
在一片树形保护区中,有 n 个观察点,观察点之间由步道连接,整体形成一棵树。每条步道被标记为 R 或 B 两种类型之一。一条路径的长度定义为路径上步道的数量。如果一条路径中任意相邻两条步道的类型不同,则称该路径为交替路径。请计算这棵树中最长交替路径的长度。
节点数 n 满足 1≤n≤105,观察点编号 u,v 满足 1≤u,v≤n。输入保证给出的图是一棵树。
第一行输入一个正整数 n,表示树的观察点数(1≤n≤105)。
接下来 n−1 行,每行输入两个整数 u,v 和一个字符 c,表示观察点 u 与观察点 v 之间有一条步道,该步道的类型为 c。c 只会是字符 R 或 B。节点编号满足 1≤u,v≤n,输入保证形成一棵树。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册