幅優先探索ドリルのサムネイル
(問題 34)ワープ Objective-C編(paizaランク S 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

整数 N, M が与えられます。N 個の頂点と M 個の辺があるグラフを与えられます。

i (1 ≦ i ≦ M) 番目の辺は頂点 a_i と頂点 b_i を結んでいます。

また、それぞれの頂点にはワープ装置が置かれており、頂点 i (1 ≦ i ≦ N) のワープ装置の識別番号は C_i です。同じ識別番号同士はワープ装置を利用して移動することが出来ます。

それぞれの頂点において、頂点 1 からたどり着くまでに必要な移動回数の最小値を求めてください。ただし、ワープ装置の利用も 1 回の移動として数え、たどり着かない場合は -1 とします。

入力される値

N M
a_1 b_1
a_2 b_2
...
a_M b_M
C_1 C_2 ... C_N


1 行目には 2 つの整数 N, M が与えられます。

1 + i (1 ≦ i ≦ M) 行目には 2 つの整数 a_i, b_i が与えられます。

2 + M 行目には N 個の整数 C_1, C_2, ..., C_N が与えられます。

入力は合計で 2 + M 行からなり、入力値最終行の末尾に改行が 1 つ入ります。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

答えを N 行で出力してください。

i (1 ≦ i ≦ N) 行目には頂点 i に移動するまでに必要な移動回数を出力してください。

条件

すべてのテストケースにおいて、以下の条件をみたします。

  • 4 ≦ N ≦ 100000

  • 1 ≦ M ≦ min(N × (N - 1) / 2, 200000)

  • 1 ≦ a_i, b_i ≦ N (1 ≦ i ≦ M)

  • a_i ≠ b_i (1 ≦ i ≦ M)

  • 1 ≦ C_i ≦ N (1 ≦ i ≦ N)
  • 入力例1

    6 2
    1 2
    3 6
    1 2 1 2 1 3

    出力例1

    0
    1
    1
    2
    1
    2

    問題一覧へ戻る

    1. paizaトップ
    2. レベルアップ問題集
    3. 幅優先探索ドリル(言語選択)
    4. 問題一覧 Objective-C編
    5. (問題 34)ワープ Objective-C編
    ページの先頭へ戻る