发现在确定了根之后,所有的蓝边都应该是 fai→i→soni 这样连接的,因为如果出现了 soni→i→soni′ 这样的情况就会出现需要两个根的情况,因为蓝边都是由红边拆分得到的。
考虑进行 DP,设 fi,0/1 表示在拟定以 1 为根的情况下 i 是否作为蓝边 fai→i→soni 中 i 的位置。
那么对于 fi,0 的情况,显然有转移:
fi,0=j∈son(i)∑max(fj,0,fi,1+wi,j)
对于 fi,1 的情况,那么应该选择到一个儿子作为蓝线,其他的情况按照 fi,0 进行转移就可以了。
fi,1=fi,0+j∈son(i)max{fj,0+wi,j−max(fj,0,fj,1+wi,j)}
接下来考虑进行 O(1) 换根,考虑在记录最大值的同时记录次大值。发现在 fai 是根的情况下将 i 设为根节点,那么只需要让 i 多考虑 fai,让 fai 少考虑 i 即可。
时间复杂度为 O(n)。