发现在确定了根之后,所有的蓝边都应该是 faiisonifa_i\to i\to son_i 这样连接的,因为如果出现了 soniisonison_i\to i\to son_i' 这样的情况就会出现需要两个根的情况,因为蓝边都是由红边拆分得到的。

考虑进行 DP,设 fi,0/1f_{i,0/1} 表示在拟定以 11 为根的情况下 ii 是否作为蓝边 faiisonifa_i\to i\to son_iii 的位置。

那么对于 fi,0f_{i,0} 的情况,显然有转移:

fi,0=json(i)max(fj,0,fi,1+wi,j)f_{i,0}=\sum\limits_{j\in son(i)} \max(f_{j,0},f_{i,1}+w_{i,j})

对于 fi,1f_{i,1} 的情况,那么应该选择到一个儿子作为蓝线,其他的情况按照 fi,0f_{i,0} 进行转移就可以了。

fi,1=fi,0+maxjson(i){fj,0+wi,jmax(fj,0,fj,1+wi,j)}f_{i,1}=f_{i,0}+\max\limits_{j\in son(i)} \{f_{j,0}+w_{i,j}-\max(f_{j,0},f_{j,1}+w_{i,j})\}

接下来考虑进行 O(1)O(1) 换根,考虑在记录最大值的同时记录次大值。发现在 faifa_i 是根的情况下将 ii 设为根节点,那么只需要让 ii 多考虑 faifa_i,让 faifa_i 少考虑 ii 即可。

时间复杂度为 O(n)O(n)