题解 CF1495D BFS Trees
link
因为这个方案数肯定很大,用其他方法都不好直接搞。一般来说有两种方法:按边求解 和 按一个点的父亲是谁求解。(实际操作是有区别的)
每条边单独求解似乎是比较合计的选择(因为这个方案数肯定很大,用其他方法都不好搞)。
还是不要轻易弃做法啊。(可以把 idea 写纸上,一个一个试)
哈哈哈但是边单独求解算不出来个什么。那我们就用 B 计划(按一个点的父亲是谁求解)。枚举两个根,枚举 \(i\),遍历 \(j\)(前提是 \(i,j\) 有边!!!不然连个寂寞!!!所以复杂度不是 \(\mathcal {O}(n^4)\) 而是 \(\mathcal {O}(n^2(n+m))\)),统计对于两个起点都满足 \(dp_j+dis_{i,j}=dp_i\) 的情况,即保证 \(i\) 合法。像这样独立计算接在前一状态的题还有很多。
但是这种情况有特例,就是在一个点作为根时 \(fa_i=j\),另一个作为根时 \(fa_j=i\)。考虑什么样的点会这样?\(i\) 到 \(j\) 的最短路上!所以有必要把最短路单独拎出来考虑。若最短路只有一条,那么这条最短路必须在树上。若最短路有多条,那么手玩得出不合法。
于是便可做了。