关键点在于:全排列中,任意两点u.v相邻的次数一定是(n - 1)! * 2次,即一个常数(可以由高中数学知识计算,将这两个点捏一起然后全排列然后乘二:或者用n! / C(2, n)). 这之后就好算了,每条边算一下子树size对吧,乘法原理就是贡献次数,乘以边权加一起就行了. 所以不是dfs就行了吗,跟dp有啥关系…… PS:变量名起的不行,不该叫inv,而是fac,代表阶乘 ; ; int n, tot; int size[maxn]; struct Edge { int to, nxt;…