「24ネットワークフロー問題」ラウンドテーブルディナー

ネットワークフローの問題、コードを詳しく見て

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、00 );
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 }
コードの表示

おすすめ

転載: www.cnblogs.com/shatianming/p/12227600.html