P7418 [USACO21FEB] Counting Graphs P
题目大意:
给定一张图,对于另一张合法的图,当且仅当两张图 ( u , v ) (u, v) (u,v) 之间所有的路径长度相同。统计所有合法的图的数量。注意路径不一定是简单路径。
看到路径不一定是简单路径基本上就可以猜到做法了。因为是复杂路径一条边重复走是增加 2 2 2 的贡献,所以只要任意两点之间最短奇偶路径相同即可。我们可以找出这样的路径。我们任意找一个起点,之后可以得到 n n n 个数对。我们为了方便钦定 ( x , y ) , x < y (x, y), x < y (x,y),x<y。
我们考虑一条边可以产生贡献而且是合法的是什么情况。对于一个 ( x , y ) (x, y) (x,y) 来说之前的点对 $ + 1$ 必须保证 x 1 + 1 − x ≡ 0 ( m o d 2 ) , y x_1 +1 - x\equiv 0\pmod 2, y x1+1−x≡0(mod2),y 同理。然后我们不一定每一个点都要考虑,直接继承就好了。
所以总共有 3 3 3 种点。
(x - 1, y - 1)
是 A A A 类边,点个数为 a a a。(x - 1, y + 1)
是 B B B 类边,点个数为 b b b。(x + 1, y - 1)
是 C C C 类边,点个数为 c c c。(x, y)
是当前的点对,点个数为 d d d。
我们发现如果链接了 A A A 类边直接就合法了。如果不链接 A A A 类边就必须同时连接 B , C B, C B,C 类边。
我们发现对于当前点,然后对于其左下方的点本质上就是一个子状态。那么我们 d p dp dp 的顺序就是让 x + y x + y x+y 小的先 d p dp dp。不然就是让 x x x 从小到大 d p dp dp。
因为需要考虑链接了几个 B B B 类边。然后我们不可能对于一个点同时计算 B , C B, C B,C 类边。这样就重复计算了。所以不妨钦定只计算 B B B 类边。同时计算上一个状态的 C C C 类边。
设 f ( a , b , x ) f(a, b, x) f(a,b,x) 表示当前的点对是 ( a , b ) (a, b) (a,b) 然后恰好还有 x x x 个点需要链接 C C C 类边。
之后我们发现进行 d p dp dp 的时候需要考虑 B B B 类边。我们预先设状态
g ( a , b , x ) g(a, b, x) g(a,b,x) 表示对于点对 ( x , y ) (x, y) (x,y) 恰好有 x x x 个点不链接 B B B 类边。
我们转移的时候考虑上面一个状态链接了几条边。
g ( a , b , x ) = ( d x ) ∑ y = 0 d f ( a − 1 , b + 1 , y ) × F ( b , y , d − x ) g(a, b, x) = \binom{d}{x}\sum_{y = 0} ^ {d} f(a - 1, b + 1, y) \times F(b, y, d - x) g(a,b,x)=(xd)y=0∑d