この問題は 01BFS を問います。

aa にいる時点での行動は、次のいずれかです。

  • a+Ka+K をつなぐ橋を作る(魔法を 11 回使う) ...①
  • aa とつなぐ島 p1,p2,...,pnp_1,p_2,...,p_n のいずれか 11 つの島に行く(魔法は使わない) ...②

①について、この橋は魔法を使う必要があります。魔法を使うことで島 a+Ka+K と隣接している島に移動することが可能となります。
②について、魔法を使わずに移動することが可能です。

こうしてみると、この問題は次の問題に帰着することができます。

  • 有向グラフが与えられ、島と島をつなぐ辺には 0,10,1 の重みが付加されている。
    このとき島 Ai,BiA_i,B_i を互いにつなぐ辺には重み 00 、それ以外の辺※にはすべて重み 11 が付加されている。
    11 から島 NN まで辺の上を移動することでたどり着くとき、歩いた辺の重みの総和の最小値を求めよ。

これは単一始点最短経路探索(ダイクストラ法など)問題に他なりません。しかし今回は 0,10,1 のいずれかの重みが加えられているので、これは 01BFS といった探索法を用いることにより解くことができます。

計算量は O(N+M)O(N+M) でこの問題を解くことができました。以下が解答例になります。

※「それ以外の辺」というのはある 11 以上 NKN-K 以下の整数 aa であって、すべての辺の情報において (Ai,Bi)(a,a+K)(A_i,B_i)\ne(a,a+K) が成り立つとき、島 a,a+Ka,a+K を互いにつなぐ(仮想的な)橋をいいます。この橋を建設するのに魔法を 11 回要しますから、重み 11 を付加してあげる必要があります。

追記: 想定解の修正をしました。島 aa から島 a+Ka+K に橋を作ることはできますが、島 aa から島 aKa-K には橋をかけることはできないことに注意してください。

  • C++
  • Python