emmm
タイトルはまた、非常に明らかにされています
トピックリンク:https://www.luogu.com.cn/problem/P3376
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 200000 + 5 。 INT最後[MAXN]、NXT [MAXN * 2へ]、[MAXN * 2 ]、WI [MAXN * 2 ]、CNT = - 1 。 int型の深い[MAXN]。 INT S、T、N、M。 ボイド追加(INT U、INT V、INT W) { に[ ++ CNT] = V。 Wi [CNT] = W。 NXT [CNT] = 最後[U]。 最後[U] = CNT。 リターン; } ブールBFS() { キュー < INT > Q。 memsetの(深い、0、はsizeof (深いです))。 しばらく(!Q.empty()) Q.pop(); Q.push(S); 深い[S] = 1 。 実行{ int型、U = Q.front()。Q.pop(); 以下のための(int型 - ;!I = [U]私は最後の= 1 ;私は= NXT [I])を 場合(のwi [I]> 0 &&深い== [i]の[へ] 0 ) { 深い[I]乃至] =深い[U] + 1 。 ([I]に)Q.push。 } } しばらく(!Q.empty()); もし(深い[T] == 0)戻り 0 ; リターン 1 ; } int型の DFS(INT U、INT DIST) { 場合(U == T)戻りDIST。 以下のために(int型私は、最後の= [U];!I = - 1 ;私は= NXT [I])を 場合(深い==深い[U] + [I]へ] 1 &&のwi [I] =!0) { int型ジ= ([i]は、分(DIST、WI [I]に)DFS)。 もし(ジ> 0 ) { のWi [I] = - ;ジ Wi [I ^ 1 ] + = ジ。 リターン・ディ。 } } 戻り 0 。 } int型dinic() { int型 ANS = 0 。 一方、(BFS()) ANS + = DFS(S、100000007 )。 戻り値は、ANS; } int型メイン() { memsetの(最後に、 - 1、はsizeof (最終))。 memset(NXT、 - 1、はsizeof (NXT))。 CIN >> N >> M >> S >> T。 以下のために(INT iが= 1 ; I <= M; I ++ ) { int型、U、V、W。 CIN >> U >> V >> ワット。 (U、V、W)を加えます。 追加(V、U、0 ); } COUT << dinic()。 リターン 0 ; }