f(x)={x÷2x×2xが偶数xが奇数 とします。
4N の頂点 x1,…,xN,y1,…,yN,z1,…,zN,w1,…,wN を用意します。
まず道i=(ai,bi,ci) (i=1,…,M) について、以下のように辺を張ります。
- xai→xbi に重み ci の辺
- ybi→yai に重み ci の辺
- zai→zbi に重み f(ci) の辺
- wbi→wai に重み f(ci) の辺
さらに、
i=1,…,N について、
- xi→yi に重み X の辺
- xi→zi に重み Y の辺
- yi→zi に重み Y の辺
- zi→wi に重み X の辺
を張ります。
このグラフに対して、辺の張り方より以下が成り立ちます:
- {x1,…,xN} の誘導部分グラフは、魔法を使っていないときの国のグラフと一致する
- {y1,…,yN} の誘導部分グラフは、魔法1を使ったときの国のグラフと一致する
- {z1,…,zN} の誘導部分グラフは、魔法2を使ったときの国のグラフと一致する
- {w1,…,wN} の誘導部分グラフは、魔法1と魔法2を使ったときの国のグラフと一致する
魔法を一度も使っていない状態で頂点 i にいて、魔法1を使うことを考えます。
魔法を一度も使っていない状態は、今考えているグラフで xi にいることに対応します。
魔法1を使うと、今考えているグラフで yi にいることに対応します。
つまり、「魔法を一度も使っていない状態で頂点 i にいて、魔法1を使う」は、「xi→yi の重み X の辺を通る」ことに対応します。
同様のことが xi→zi,yi→wi,zi→wi の辺についても言えます。
よって、このグラフについて x1 からスタートし、xN,yN,zN,wN まで移動するときの最短時間をそれぞれダイクストラ法を用いて計算し、そのうち最小のものが答えになります。
32bit整数で計算するとオーバーフローするケースが存在するので、64bit整数で計算する必要があります。