[テンプレート]ネットワークフローISAP

  1つの#include <ビット/ STDC ++ H>
   2  使用して 名前空間STDを、
  3  のconst  int型 N = 1E5 + 8   4  int型の CNT = 1   5  構造体の縁{
   6      INT に、NEX、W。
  7 } E [ 2 * N]。
  8  INT S、T、N、M。
  9  int型H [N]、CUR [N]、ギャップ[N]、DEP [N]、あらかじめ[N]。
10  ボイド追加(int型int型 B、INT {W)
 11      E [++ CNTを] = (エッジ){B、H [A]、W}。
12      時間[A] = CNT。
13  }
 14の 空隙BFS(){
 15      のmemset(ギャップ、0、(N + 1)* はsizeofINT ))。
16      のmemset(DEP、 - 1、(N + 1)* はsizeofINT ))。
17      DEP [T] = 0 ;
18      ギャップ[ 0 ] = 1 19      キュー< 整数 > Q;
20      q.push(T)。
21      ながら(!q.empty()){
22          INT U = q.front()。
23          q.pop()。
24          のためにint型 I = CUR [U] = hの[U]; I; I = E [I] .nex){
 25              のint V = E [I] .TO。
26              もし(DEP [V] = - !1続けます27              q.push(V)。
28              DEP [V] = DEP [U] + 1 29              ++ ギャップ[DEP [V]]。
30          }
 31      }
 32  }
 33  INT CAL(){
 34      int型フロー=0x3f3f3f3f ;
35      のためにint型 I = sで、I = T;!私= 。E [CUR [I])が 
 36          流量= 分(フロー、E [CUR [i]は、W。);
37      のためには、int型 I = Sを、I = T;!私= 。E [CUR [I]に){
 38          。E [CUR [I] W- = 流;
39          E [CUR [I] ^ 1 ] .W + = 流量;
40      }
 41      リターン流;
42  }
 43  のint ISAP(){
 44      INT ANS = 0 45の     BFS()。
46      int型のu =S、V。
47      一方(DEP [S] < N){
 48          であれば(U == T){
 49の              ANS + = CAL()。
50              U = S。
51          }
 52          ブール FG = 0 53          のためにINT ; I; I = CUR [U] I = E [I] .nex){
 54              場合は(E [I] .W && DEP [U]> DEP [V = E [i]の.TO]){
 55                  事前[V] = U。
56                  CUR [U] = I。
57                  U = V。
58                  FG =1 ;
59                  ブレーク;
60              }
 61          }
 62          場合(FG)を続けます63          もし(! -ギャップ[DEP [U]]) レーク64          INT maxdis = N。// N是点数
65          のためのint型 I = Hを[U]; I; I = E [I] .nex){
 66              であれば(E [I] .W && maxdis> DEP [V = E [I] .TO ]){
 67                  maxdisの=のDEP [V]。
68                  CUR [U] = I。
69              }
 70          }
71          ギャップ[DEP [U] = maxdis + 1 ] ++ ;
72          場合(U = sで!)U =は、予め[U]。
73      }
 74の     リターンANS。
75  }
 76  INT メイン(){
 77      のint T。
78      のscanf(" %dの"、&T)。
79      一方(T-- 80      {
 81          のscanf(" %D%dの"、&​​N、&M)。
82          INTマックス= 0、最小= 0x3f3f3f3f 83          CNT = 1 84          のmemset(H、0、(N + 1)* はsizeofINT ))。
85          のためにint型 I = 0 ; iがN <; Iは++ 86          {
 87              のint X、Yと、
88              のscanf(" %D%dの"、およびX&Y)。
89              であれば(最大<X)最大= X、T = I + 1 90              であれば(最小> X)分= X、S = I + 1 91          }
 92          のためにint型私= 0 ; 私は<M。私は++ 93          {
 94              int型のU、V、W。
95              のscanf(" %D%D%D "、&​​U&V、およびW)
96              追加(U、V、W)。
97              (V、U、W)を加えます。
98          }
 99          のprintf(" %d個の\ n " 、ISAPを())。
100      }
 101      戻り 0 ;
102 }

 

おすすめ

転載: www.cnblogs.com/xiaobuxie/p/11391886.html