目录
题目链接
传送门
题意
定义\(L(a,b)\)为结点\(a\)到结点\(b\)的路径上的结点数,问有种\(pair(L(a,b),L(c,d))\)取值,其中结点\(a\)到结点\(b\)的路径与结点\(c\)到结点\(d\)的路径没有交叉。
思路
我们很容易想到要想两条路径不交叉,那么\(a,b\)与\(c,d\)必定在两棵不同的子树中,假设第一棵子树的直径位\(L1\),第二棵子树的直径为\(L2\),那么我们可以得知\([1,L1]\)必定可以与\([1,L2]\)进行匹配,那么对于\([1,L1]\)中的每个数\(x\)可以和\([1,L2]\)中的每个数\(y\)构成满足题意的\(pair(x,y)\),此时\(x\)的贡献就是\(L 2\),由于不能重复,因此我们对每个长度可以匹配的方案取一个\(max\),最后加起来就是答案了。
最后本题的难点就变成了求断开每条链后产生的两棵子树的直径了。
我们定义\(dp[i][0]\)为以\(i\)为根节点的子树中以\(i\)为一个端点的最长距离,\(dp[i][1]\)为次远,\(dp[i][2]\)为第\(3\)远,那么这个子树的直径为\(max(\)以\(i\)为子树中不经过\(i\)的最长链,经过\(i\)的最长链\()\),\(dp[i][3]\)为\(i\)从其父亲结点往父亲的其他链能到达的最远距离,则断开\(i\)与其父亲的这条链生成的另一棵子树的直径就为\(max(\)不经过\(i\)的父亲结点的最长链,经过\(i\)的父亲结点的最长链\()\),具体转移请看代码。
代码
#include
#include