CF814E An unavoidable detour for home

考虑有每个最短路只有一条.
那么我们建出最短路树后,显然所有的非树边都是同层之间的横叉边。
那么我们考虑设(f(i,j,k,z))为我们考虑到了第(i)个点,此时他被我们分配到了(p)层,而(p-1)层作为完整的层,其总共有(j)条向下的边,而(p)层有(k)个向下一边的点,(z)个向下两边的点。

那么我们考虑
(f(i,0,c1,c2))变为(f(i,c1 + 2c2,0,0))即我们划分了一个新的层。
(f(i,c1 + 2c2,0,0) = frac{(c1 + 2c2)!}{2^c2}f(i,0,c1,c2))
那只需要考虑(i)(i-1)转移而来:
那么就需要枚举一下(i)和哪些点相连。
如果它不连:
则直接:
(f(i,j-1,c1,c2) = f(i - 1,j,c1,c2))
如果它连一个
则有在(c1 + c2)个点里找一个点进行横叉边的链接:
连的是一个一度点:
(f(i,j - 1,nc1 - 1,nc2) = c1f(i - 1,j,c1,c2))
连的是一个二度点:
(f(i,j - 1,nc1 + 1,nc2 - 1) = c2f(i - 1,j,c1,c2))
如果它连了两个:
则如果它连的都是一度点:
(f(i,j - 1,nc1 - 2,nc2) = inom{c1}{2}f(i - 1,j,c1,c2))
则如果它连的都是二度点:
(f(i,j - 1,nc1 + 2,nc2 - 2) = inom{c2}{2}f(i - 1,j,c1,c2))
如果它连的一个是一度点,一个是二度点:
(f(i,j - 1,nc1,nc2 - 1) = c1c2f(i - 1,j,c1,c2))

是一个很暴力的(O(n^4))的做法。

原文地址:https://www.cnblogs.com/dixiao/p/15357269.html