D - All Your Paths are Different Lengths
提出コード
n進数を利用する、というところまではよかったのですがそこから歯が立ちませんでした。
結論から言うと2進数を利用します。
まずは大元となる2進数のグラフを作成します。
となるうちの最大のxを求めます。
が2~3で
は2、4~7で
は3、といった具合です。
そして、個の頂点を用意して、
から
の頂点に、それぞれ
と、
の重みをつけた辺をつくります。
これで、~
まではすでに網羅できています。

のとき
ということで、あとは残った部分を付け加えていきます。
ここで注目するべきポイントは、
頂点1から頂点iまでには、
~
までの数がそろっている
ということです。上の図でいうと、頂点1から3までだと0~3、1から2だと0~1、ということです。
連続した数字がそろっているので、これをうまく利用していきます。
あと付け加えるべき数字は、から
までになります。
これらも連続している数字になります。
ここで、i番目の頂点からxに、pという重みの辺を付けてみると、新しく作成できる数字は
~
になります。
iが大きいほど作成できる数字の個数が多いので、後ろから貪欲に作成できるならする、しないなら次へ、ということを繰り返していけばいいです。
今残っている未作成の数字がから
とし、次に見る頂点をiとします。
、すなわちあと作るべき個数が
以上のとき
頂点iから頂点xに、重みがpの辺を作成します。
あと作るべき未作成の数字はから
になります。
上記の条件を満たさないとき
スルーします。
あとは、iを後ろから動かすことにより全探索をします。