题解:AT_abc389_g [ABC389G] Odd Even Graph
2008verser
·
·
题解
场上大脑被标号分配卡死了。没有困难的性质需要观察,只要找到自然的方法,顺着计数就能做出来。
看到要关注每个点的最短路,那么肯定是要先将图分层,就像这样。
换言之我们计数若干层点的“组合体”的数目(组合体和图形成双射)。这些组合体要求:
- 每个点都与上一层有至少一条边相连。
- 只有相邻的层有边相连。
- 一个层内随意连边
- 一号点在第一层。
- 奇数层和偶数层总点数相等。
设计状态 f_{i,n1,m,d,0/1} 表示有 i 个点 m 条边的组合体数目,奇偶点之差为 d,最后一层有 n1 个点,最后一层是奇数层呢还是偶数层呢。
转移枚举新一层点数 s 和边数 x。这里 x 既包括两层之间的边,也包括下一层自己内部随意连的边。
下意识地设 h_{n1,s,x} 表示转移系数,这样转移就是
f_{i,n1,m,d,op}\times h_{n1,s,x}\times{i-1+s\choose s}\to f_{\ldots}
组合数是为了分配标号,减一是因为 1 一定在第一层。接下来想想,为了让这个方程是对的,h 的两个点集应是已经标号的。
那么求 h 的方法就很清晰了,对于每个 s 的点枚举它向 n1 连了 a(a\gt 1) 条边那就是 n1\choose a 种方案,乘起来。
比如我要算两层之间连了 x' 条边,这个数量就是
\sum_{a_1+a_2+\ldots+a_s=x'}\prod{n1\choose a_i}
还没算新层内部的连边呢。我可以先做上面这部分,接着同层转移就可以求出最终的 h 了。
内部连边就是在 s\choose 2 条边里选啊,这个不必多说了。
我们进行一个代码的写,在 n=30 计算次数达到了 2\times 10^9 左右。
因此进行一个枝的剪(或者直接开 O2),具体可以看我的代码。atcoder 上在不开 O2 情况下运行了三百多毫秒。
然而本地 n=30 跑了两秒。
AC 链接