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((エッジ){にから、0、0 })。 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 }