ネットワークフローの問題、コードを詳しく見て
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 4 INT N、M、TOT = - 1、H [ 3005 ]、ANS = 0、和= 0 。 5 構造体ノード{ 6 INT から、完全次に、残りの部分に、。 7 INT 最後。 8 } E [ 100005 ]。 9 ボイド追加(int型のx、int型のy、int型Z){ 10 TOT ++ 。 11 E [TOT] .next = H [X]。 12 H [X] = TOT。 13 E [TOT]。= X。 14 E [TOT] .TO = Y。 15 E [TOT] .rest = Z。 16 E [TOT] .full = Z。 17 } 18の19 のint DIS [ 3005 ]、G [ 3005 ]、フロー[ 3005 ]。 20 BOOL VIS [ 3005 ]。 21の22 のint BFS(INT S、INT T){ 23 キュー< INT > Q。 24の DIS [S] = 0 ; 25 q.push(S); VIS [S] = 真。 26 ながら(!{q.empty()) 27 INT U = q.front(); VIS [U] = 偽; q.pop()。 28 のために(INT iはH [U] =; - I =(!1 ; I =)は、Eを[I] .next){ 29の 場合(DIS [E [i]は.TO]> DIS [U] + 1 && G [ E [i]は.TO] ==( - 1)&& E [I] .rest> 0 ){ 30 G [E [i]は.TO] = I。 31 流量[E [i]は.TO] = 分(フロー[U]、E [I] .rest)。 32の DIS [E [i]は.TO] = DIS [U] + 1 。 33 であれば(VIS [E [i]は.TO] == 偽){ 34 VIS [E [i]は.TO] = 真。 35 q.push(E [I] .TO)。 36 } 37 } 38 } 39 } 40 } 41 42 INT EK(INT S、INT T){ 43 ながら(1 ){ 44 のmemset(VIS、偽、はsizeof (VIS))。 45 のmemset(DIS、0x7Fを、sizeof (DIS))。 46 のmemset(流れから0x7f、はsizeof (フロー))。 47 のmemset(G、 - 1、はsizeof (G))。 48の BFS(S、T)。 49 であれば(G [T] ==( - 1))戻り 0 ; 50の ANS + = 流量[T]。 51 のために(INT。; P =(S);!P = T P = E [] G [P] から){ 52 。E [G [P] = REST-は[t]を流れます。 53 E [G [P] ^ 1 ] + = .rest フロー[T]。 54 } 55 56 } 57 } 58 59 INT メイン(){ 60 のmemset(H、 - 1、はsizeof (H))。 61 CIN >> M >> N。 62 のために(INT iは= 1 ; iが<= M; I ++ ){ 63 のint CO; CIN >>はCO、合計+ = CO。 64 追加(0 、I、CO)。 65 追加(I、0、0 ); 66 のために(INT J = 1 ; J <= nであり、j ++ ){ 67 追加(I、J + M、1 )。 68 追加(J + M、I、0 ); 69 } 70 } 71 のために(INT iは= 1 ; I <= N; I ++ ){ 72 INT CO; CIN >> CO。 73 追加(I + M、N + M + 1 、CO)。 74 追加(N + M + 1、I + M、0 ); 75 } 76 EK(0、N + M + 1 )。 77 であれば(和> {ANS) 78 coutの<< 0 << てendl; 79 出口(0 ); 80 } 81 COUT << 1 << ENDL。 82 のために(INT iが= 1 ; iが<= M; I ++ ){ 83 のために(INT J = H [I]; J =(! - 1); J = E [J] .next){ 84 であれば(E [ !J] .TO = 0 && E [J] .rest == 0 ){ 85 .TO-M COUT << E [J] << " " 。 86 } 87 } 88 coutの<< てendl; 89 } 90 }