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)* はsizeof(INT ))。 16 のmemset(DEP、 - 1、(N + 1)* はsizeof(INT ))。 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)* はsizeof(INT ))。 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 }