#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INT nmaxn = 5000 + 8、mmaxn = 50000 + 7 。 BOOL VIS [nmaxn]。 INT H [nmaxn]、[nmaxn]、EF [nmaxn]、[nmaxn] [nmaxn]、NUMを事前DIS。 構造体の縁{ int型、にNEX、FL、CO。 } E [mmaxn << 1 ]。 INT S、T、CNT = 0 。 ボイド追加(INT U、INT V、INT COS、INT FLO){ E [CNT] =(エッジ){V、H [U]、FLO、COS}。 H [U] = CNT ++ 。 } BOOL spfa(){ memsetの(DIS、0x3f3f3f3f、はsizeof (DIS))。 EF [S] = 0x3f3f3f3f 。 DIS [S] = 0、VIS [S] = 1 。 事前[T] = 0 ; キュー < 整数 > Q; q.push(S); しばらく(!q.empty()){ int型のu = q.front(); )(q.pop; VIS [U] = 0 ; 以下のための(int型I = hの[U]; I =! - 1 ; I = E [I] .nex){ int型、V = E [I] .TO。 もし(E [I]の.Fl && DIS [V]> DIS [U] + E [I] .CO){ DIS [V] = DIS [U] + E [i]の.CO。 事前[V] = U; NUM [V] = I。 EF [V] = 分(EF [U]、E [I]の.Fl)。 もし(!VIS [V]){ q.push(V); VIS [V] = 1 。 } } } } 戻りプレ[t]を。 } int型{main()の INTの N、M; scanf関数(" %D%D%D%D "、&N、&M、&S&T)。 memsetの(H、 - 1、はsizeof (H))。 以下のために(int型 I = 1 ; I <= M; ++ I){ int型、U、V、F、W; scanf関数(" %D%D%D%D "、&U&V、およびW、およびF)。 追加(U、V、F、W)、追加(V、U、 -F、0 ); } INT ansf = 0、ANSC = 0 。 一方、(spfa()){ ansf + = EF [T]。 ANSC + = EF [T] *DIS [T]。 以下のために(int型 iはTを=; I = sで、I =!事前[I]){ E [NUM [I]、FL。 - = EF [T]。 E [NUM [I] ^ 1 ]の.Fl + = EF [T]。 } } のprintf(" %D%dの" 、ansf、ANSC)。 リターン 0 ; }