1. paizaラーニングトップ
  2. レベルアップ問題集
  3. ネットワークフローメニュー(言語選択)
  4. 問題一覧 Perl編
  5. 最大流問題 1 Perl編

ネットワークフローメニューのサムネイル
最大流問題 1 Perl編(paizaランク B 相当)

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

問題

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

このメニューでは、ネットワークフローの最も基本的な問題である最大流問題を解いていきます。

まずは、ネットワークフローとは何かについて理解しましょう。ひとことでいうと、ネットワークフローとは、グラフ上で流れを考える問題です。たとえば、各地点を水道管でつないだグラフを考えてみましょう。このグラフ上で、ある地点から別の地点へ、一定の水を流し続けることを考えます。当然ですが、始点と終点以外では、各地点に入ってくる水の量と出ていく水の量は同じでなければなりません。このとき、流れる水は分岐したり合流したりして、いくつかの経路をたどって終点まで到着します。この水の流れのことを、フローと呼びます。



この例では、常に (単位時間あたり) 30 L の水が流れつづけています。この流れる水の量を、フローの流量と呼びます。

現実世界では、各辺に流すことのできる最大の量 (容量) が決まっていることが多いでしょう。 そのような制約が与えられたときに、どれだけ大きい流量のフローを流せるかを考えるのが、最大流問題です。



赤い文字で表示されている部分が容量になります。
上の例では、中央の辺を使わずに目一杯流すことで、さらに 5 L 多く流すことができます。



では、手始めに簡単なネットワークフローの問題を解いてみましょう。

辺に容量の制約がある n 頂点 m 辺のグラフが与えられます。各頂点には 1 から n までの番号がついており、各辺は頂点 a_i から頂点 b_i へ向かうもので、容量が c_i になっています。(1 ≦ i ≦ m)
このグラフ上で、始点 s から終点 t へ流量 1 のフローを流せるかどうかを判定してください。

(ヒント)


すべての辺の容量は 1 以上なので、始点 s から終点 t へ流量 1 のフローを流せることと、始点 s から終点 t への経路が存在することは同じになります。

入力される値

n m s t
a_1 b_1 c_1
a_2 b_2 c_2
...
a_m b_m c_m

・ 1 行目に、グラフの頂点数を表す整数 n, グラフの辺数を表す整数 m, フローの始点、終点の頂点の番号を表す整数 s, t が半角スペース区切りで与えられます。
・ 続く m 行では、各辺の情報を表す整数 a_i, b_i, c_i が半角スペース区切りで与えられます。(1 ≦ i ≦ m) a_i, b_i は、辺の始点、終点の頂点の番号を表します。c_i は、i 番目の辺に流すことのできる最大の流量 (容量) を表します。


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

始点 s から終点 t へ流量 1 のフローを流せる場合は 'Yes'、流せない場合は 'No' を出力してください。

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

条件

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

・ 入力はすべて整数
・ 2 ≦ n ≦ 100 = 10^2
・ 1 ≦ m ≦ 10,000 = 10^4
・ 1 ≦ s, t, a_i, b_i ≦ n
・ 1 ≦ c_i ≦ 100 = 10^2
・ s ≠ t, a_i ≠ b_i
・ (a_i, b_i) ≠ (a_j, b_j) (i ≠ j)

入力例1

4 5 1 4
1 2 20
1 3 15
2 3 10
2 4 20
3 4 15

出力例1

Yes

問題一覧へ戻る

ページの先頭へ戻る