1. paizaラーニングトップ
  2. レベルアップ問題集
  3. ベルマンフォードメニュー(言語選択)
  4. 問題一覧 Python3編
  5. 隣接頂点の出力 Python3編

ベルマンフォードメニューのサムネイル
隣接頂点の出力 Python3編(paizaランク D 相当)

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

問題

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

この問題集では、最短経路問題を解くアルゴリズムの一つであるベルマンフォード法を扱います。最短経路問題とは、重み付きグラフの与えられた 2 点を結ぶ経路のうち、コスト(距離など)が最小のものを求める問題です。ベルマンフォード法を使うと、グラフのある頂点からそのほかの各頂点への最短距離を求めることができます。この問題集では、いくつかのステップにわけてベルマンフォード法の理解を深めます。

まずは、ある頂点に隣接している頂点をすべて求めてみましょう。

1,...,N の番号のついた N 個の頂点とそれらをつなぐ枝からなる有向グラフを考えます。ただし、自己ループと多重辺は考えません。

M 本の有向枝と頂点番号 s が与えられます。頂点 s から一回の枝の移動で到達可能な頂点の番号を昇順(小さい順)にすべて出力してください。そのような頂点が存在しない場合は -1 と出力してください。

入力される値

N M s
a_1 b_1
...
a_M b_M

  • 1 行目に、頂点の個数を表す整数 N と、枝の本数を表す整数 M と、頂点の番号を表す整数 s が与えられます。

  • i + 1 行目に枝 i を表す整数の組 (a_i,b_i) が与えられます。枝 i は、頂点 a_i から頂点 b_i に向かう枝です。(1 ≦ i ≦ M)

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

    s から一回の枝の移動で到達可能な頂点を左から小さい順に半角スペース区切りで 1 行で出力してください。そのような頂点が存在しない場合は -1 と出力してください。

    また末尾に改行をいれ、余計な文字、空行を含んではいけません。

    条件

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

  • 入力はすべて整数

  • 2 ≦ N ≦ 100

  • 1 ≦ M ≦ N × (N-1)

  • 1 ≦ s ≦ N

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

  • a_i ≠ b_i (1 ≦ i ≦ M)

  • 同じ頂点の組(順序組)は 2 回以上入力されない
  • 入力例1

    5 5 1
    1 2
    1 3
    2 4
    4 5
    5 2

    出力例1

    2 3

    入力例2

    5 5 3
    1 2
    1 3
    2 4
    4 5
    5 2

    出力例2

    -1

    問題一覧へ戻る

    ページの先頭へ戻る