2019年11月5日火曜日

ARC 044 B - 最短路問題

ARC 044 B - 最短路問題

とりあえずソートしてランレングス圧縮して、同じ距離の頂点グループ毎にグラフを作っていくことを考える。距離00は頂点11だけとか、距離が飛んでいる部分があってはいけないとか、そういうケースは最初に考慮しておく。

頂点11からの距離がiiの頂点がBiB_i個あるとする。距離iiの頂点同士はどうつないでもほかの頂点と11との距離に影響しない。したがって、(Bi2)\binom{B_i}{2}通りのペアすべてに自由に辺を張れるので、距離iiに対して2(Bi2)2^{\binom{B_i}{2}}通りの辺の張り方があることになる。

次に、距離i1i-1の頂点グループと距離iiの頂点グループをつなぐ辺の張り方を考える。これもだいたい自由に辺を張れるのだが、距離iiの頂点は、距離i1i-1Bi1B_{i-1}個の頂点のうち少なくとも1つにはつながれていなければならないという制約がある。「少なくとも1つ」は包除原理で書ける:

2Bi1Bi(Bi1)2Bi1(Bi1)+(Bi2)2Bi1(Bi2)...+(1)Bi(BiBi)2Bi10=k=0Bi(Bik)(1)k(2Bi1)Bik=(2Bi11)Bi\begin{aligned} & 2^{B_{i-1}B_i} - \binom{B_i}{1}2^{B_{i-1}(B_i-1)} + \binom{B_i}{2}2^{B_{i-1}(B_i-2)} - ... + (-1)^{B_i}\binom{B_i}{B_i}2^{B_{i-1} \cdot 0} \\ = & \sum_{k=0}^{B_i} \binom{B_i}{k}(-1)^k(2^{B_{i-1}})^{B_i-k} \\ = & (2^{B_{i-1}}-1)^{B_i} \end{aligned}

あっ……


包除で求めてから自明な数え方に気づくパターン、これで3回目くらい。