P2756パイロットプログラムのマッチングネットワークフロー問題

P2756パイロットプログラムのペアリングの問題

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  CONST  INT MAXN = 10005、INF = 0x3f3f3f 4  構造体のエッジ{
 5      INT  から、キャップ、流れへ。
6  }。
7  
8  構造体Dinic {
 9      int型N、M、S、T。
10      ベクター<エッジ> エッジ。
11      ベクター< INT > G [MAXN]。
12      BOOL VIS [MAXN]。
13      int型D [MAXN]。
14     int型CUR [MAXN]。
15  
16      空隙 AddEdge(INT  からINTに、int型の{キャップ)
 17          edges.push_back((エッジ){ から、に、キャップ、0 })。
18          edges.push_back((エッジ){にから00 })。
19          、M = edges.size()。
20          G【から】.push_back(M- 2 )。
21          .push_back【に】G(M- 1 )。
22      }
 23      BOOLBFS(){
 24          のmemset(VIS、0はsizeof (VIS))。
25          キュー< 整数 > QUE。
26          que.push(S);
27          D [S] = 0 ;
28          VIS [S] = 29          ながら(!que.empty()){
 30              、INT X = que.front()。que.pop();
31              のためにint型 I = 0 ; iがG [X] .sizeを()<; ++ I){
 32                  エッジ&E = 縁[G [X] [i]は]。
33                  もし(!VIS [e.to] && e.cap> e.flow){
 34                      VIS [e.to] = 35                      D [e.to] = D [X] + 1 36                      que.push(e.to)。
37                  }
 38              }
 39          }
 40          リターンVIS [T]。
41      }
 42      INT DFS(int型のx、int型A){
 43          であれば(X == T || == 0を返します44          int型流量= 0 、F。
45          のためにINT&I = CUR [X]; iはG [X] .size()<; ++ I){
 46              エッジ&E = 縁[G [X] [I]]。
47              であれば(D [X] + 1 == D [e.to] &&(F = DFS(e.to、分(e.cap-e.flow)))> 0 ){
 48                  e.flow + = F。
49の                  エッジ[G [X] [I] ^ 1 ] .flow - = F。
50                  フロー+ = F。
51                  - = F。
52                  であれば(== 0ブレーク53              }
 54         }
 55          リターン流;
56      }
 57      INT maxflow(INT S、INT T){
 58           - > S = Sで。この - > T = T;
59          int型フロー= 0 60          一方(BFS()){
 61              のmemset(CUR、0はsizeof (CUR))。
62              フロー+ = DFS(S、INF)。
63          }
 64          リターン流;
65      }
 66  } dinic。
67 INT メイン(){
 68      int型 M、N。scanf関数(" %d個の%のD "、&​​M、&N)
69      一方){
 70          INT I、J。scanf関数(" %d個の%d個"、&​​I&J)。
71          もし( - I == 1 && jは== - 1ブレーク72          dinic.AddEdge(I、J、1 )。
73      }
 74      INT S = + N 1、T = N + 2 75      のためのint型 I =1 ; I <= M。++ I){
 76          dinic.AddEdge(S、I、1 )。
77      }
 78      のためのint型 iがm + = 1 ; iは= N <; ++ I){
 79          dinic.AddEdge(I、T、1 );
80      }
 81      INT ANS = dinic.maxflow(S、T)。
82      もし(ANS == 0)プット(" 解無し!" );
83      {
 84          のprintf(" %d個の\ n " 、ANS)。
85         以下のためにint型 iは= 0 ; iはdinic.edges.sizeを()<; ++ I){
 86              であれば(dinic.edges [I] から ==秒)続けます87              場合(dinic.edges [I] .TO == t)を続けます88              であれば(dinic.edges [I] .flow == 1 ){
 89                  のprintf(" %D%D \ n "、dinic.edges [I] から、dinic.edges [I] .TO)。
90              }
 91          }
 92      }
 93      リターン 0 94 }

 

おすすめ

転載: www.cnblogs.com/wstong/p/11797923.html