「24ネットワークフロー問題」最小パスカバレッジ

私は何も言うことはありませんこれは、証明するために毎日作ります

1の#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  
4  int型 M、N、TOT = - 1、H [ 10005 ]、ANS = 0 5  構造体ノード{
 6      INT  から次は、休憩します。
7      INT 最後。
8 } E [ 100005 ]。
9  int型 HOU [ 10005 ]。
10  ブール裁判官[ 10005 ]。
11  ボイド追加(int型のx、int型のy、int型Z){
12      すべて++ ;
13      および[すべて] .next = H [X]。
14      H [X] = 全て、
15      および[すべて]。= X。
16      および[すべて] .TO = Y。
17      および[すべて] .rest = Z。
18 }
 19の20 のint DIS [ 10005 ] G [ 10005 ]流量[ 10005 ]。
21 BOOL VIS [ 10005 ]。
22 23 INT BFS(INT S、INT T){
 24      キュー< INT  
   
 > Q;
25の      DIS [S] = 0 ;
26      q.push(S); VIS [S] = 27      ながら(!{q.empty())
 28          INT U = q.front(); VIS [U] = ; q.pop()。
29          のためにINT iはH [U] =; - I =(!1 ; I =)は、Eを[I] .next){
 30の             場合(DIS [E [i]は.TO]> DIS [U] + 1 && G [ E [i]は.TO] ==( - 1)&& E [I] .rest> 0 ){
 31                  G [E [i]は.TO] = I。
32                  流量[E [i]は.TO] = 分(フロー[U]、E [I] .rest)。
33の                  DIS [E [i]は.TO] = DIS [U] + 1 34                  であれば(VIS [E [i]は.TO] == ){
 35                      VIS [E [i]は.TO] = 36                      q.push(E [I] .TO)。
37                  }
 38              }
 39          }
 40      }
 41  }
 42  
43  INT EK(INT S、INT T){
 44      ながら1 ){
 45          のmemset(DIS、から0x7fはsizeof (DIS))。
46          のmemset(VIS、はsizeof (VIS));
47          のmemset(流れから0x7fはsizeof (フロー))。
48          のmemset(G、 - 1はsizeof (G))。
49の         BFS(S、T)。
50          であれば(G [T] ==( - 1))戻り 0 ;
51の          ANS + = 流量[T]。
52          のためにINT。; P =(S);!P = T P = E [] G [P] から){
 53              。E [G [P] = REST-は[t]を流れます。
54              E [G [P] ^1 ] + = .rest 流量[T]。
55          }    
 56          
57      }
 58  }
 59  
60  INT メイン(){
 61      // freopenは( "shut1.in"、 "R"、標準入力)。
62      のmemset(H、( - 1はsizeof (H))。
63      CIN >> N >> M。
64      のためにINT iは= 1 ; iが<= N; I ++ ){
 65          追加(0、I、1 )。
66          追加(I、00 );
67      }
68      のためにINT iは= 1 ; I <= M I ++ ){
 69          のint x、y; CIN >> X >> Y。
70          追加(X、N + Y、1 )。
71          追加(N + Y、X、0 );
72      }
 73      のためにINT iは= 1 ; iが<= N; I ++ ){
 74          追加(I + N、2 * N + 11 )。
75          追加(2 * N + 1、I + N、0 );
76      }
 77      EK(02 * N + 1 )。
78      のためにINT iが= 1 ; iが<= N; I ++ ){
 79          のためにINT J = H [I]; J =(! - 1); J = E [J] .next){
 80              であれば(E [ J] .rest == 0!&& E [J] .TO = 0 ){
 81                  HOU [I] = E [J] .to- N。
82                  ブレーク;
83              }
 84          }
 85      }
 86      のmemset(裁判官、はsizeof (裁判官))。
87     以下のためにint型私は= 1 ; I <= N; I ++ ){
 88          であれば(裁判官[i]を== ){
 89              int型になりました= I;!今=(2 * N + 1)&&今=!0 ;今= HOU [今]){
 90                  COUT <<今<< "  " 91                  [今] =裁判官92              }
 93              COUT << ENDL。    
94          }
 95      }
 96      COUT << N-ANS << ENDL。
97 }
コードの表示

おすすめ

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