传送门:点击打开链接
题意:给你一棵树,有点权,求两条不相交的路径的点权和的最大值
思路:Tourist太神辣,这个代码看他的才学会的,但是他只用了10分钟敲了140行..Orz
先一次DFS求出,对于所有的点u,经过这个u点到叶子的路径点权和最大值记为down[u],以及u的子树中一条路径点权和最大值记为best[u]
然后用队列来处理,其实也可以用DFS来处理,那么数组就不能用全局变量了,必须要用vector开在函数内部
对于每个点,把它的子节点的best记录前缀最大和后缀中最大的,down记录前缀最大和次大,后缀最大和次大。
那么就可以开始讨论了,开始枚举第i个儿子,那么我认为第1条链是在第i个儿子的子树中,那么第二条链就不能在第1条链的子树中了,只能是在i节点的左边,或者i节点的右边,或者左边和右边的结合等等,具体可以看代码。
最难想到的就是用前缀和后缀在树上经行处理,写了这道题目后有了这个思想,以后就有助于扩展思路了~
#include<map>
#include<set>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<bitset>
#i