ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ARC044 B - 最短路問題

問題
提出コード

解法

頂点1が距離0でない場合や、頂点1以外が距離0である場合は、明らかに答えが0になるので処理しておきます。
それ以外のグラフについて考えます。
あらかじめ、距離がxの頂点の個数c_{x}をそれぞれカウントしておきます。
距離がxである頂点は、距離がx-1である頂点、xである頂点、x+1である頂点に向けて辺を張ることができます。x+1である頂点との辺は、距離がx+1である頂点から張る辺について考慮するときに計算すればよいので、距離がxである頂点について考えるとき、x-1の頂点とxの頂点に向けて張る辺についてのみ計算していきます。

  • 距離x-1の頂点に向けての辺の張り方
    距離xの頂点を1つ選びます。すると、この頂点は、距離がx-1である頂点のうちすくなくとも1つの頂点に向けて辺が張られていなければなりません。
    今選んだ頂点と、c_{x-1}個の頂点との辺の張り方は、2^{c_{x-1}}通りありますが、この中で選んではいけないパターンは、どこにも辺が張られていないパターンただ1つです。
    ということで、距離xの頂点1つに対し、距離x-1の頂点との辺の張り方は2^{c_{x-1}} - 1通りとなります。
    これが、c_{x}個の頂点について同じことが考えられるので、最終的に距離xの頂点とx-1の頂点についての辺の張り方は、
    (2^{c_{x-1}}-1)^{c_{x}}通り
    です。

  • 距離xの頂点同士を結ぶ辺の張り方
    距離xの頂点同士を結ぶ辺の張り方は、_{c_{x}}C_{2}通りです。今回は、全ての辺について、張る、張らないの2パターンを自由に選べます。
    ということで、
    2^{_{c_{x}}C_{2}}
    通りの張り方が存在します。

ということで、a_{i}の最大値をmとして、
\displaystyle \prod_{x = 1}^{m} (2^{c_{x-1}}-1)^{c_{x}} \times 2^{_{c_{x}}C_{2}}
が答えとなります。