소스 S라고도 싱크는 T이고, 상기 i 번째 날 나머지 수건 (일부는 하루 나머지 깨끗한 수건없이 할 수 있기 때문에, 수건, 더러운) 표시 및하여, 2 점, 즉, I1과 I2로 세분화 수건 (조건에 부합 최대 스트림을 보장), 및 다음의 측면을 고려
; 1.S는 I1의 각각 (NI, 0)의 가장자리를 연결 사용 수건 표현
(2.i2 T 개의 각각 하나의 접속을 NI, 0) 가장자리 수건 도시 소비,
(I 1) 1 (INF 접속된다 3. 각각 I1, 0) + 측 나머지 수건 전사 나타낸다
(니켈을 각각 연결된 제 S의 I2를 / INF, F) 가장자리 수건 구입 나타내는
세척 수건 법에 의해 표시되는 제 (I에도 온 (INF 빠) 가장자리 각각 I1 ++ 1) (2),
(6) 각각의 용액을 I1 ( 난 + B + 1) (2)는 (INF, FB) 측에 접속되고, B는 수건 세정 방법을 나타낸다.
당신은 모든 문제를 해결 할 수 있도록, 당신은 최소의 비용으로 최대의 흐름을 실행할 수 있습니다.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #INCLUDE <. 비트 / stdc ++ H> 2 사용 스페이스 성병; 3 #DEFINE N 2,005 4 #DEFINE의 각종 0x3f3f3f3f 5 구조체 지 { 6 의 INT NEX로 렌 비용; 7 } 에지 [N * 10 ]; 8 큐 < INT > Q; 9 INT의 E, N, A, B, F, FA, FB, t, 헤드 [N] 으로부터 [N], D [N], 힘 [N]; (10) 보이드 추가 ( INT의 X, INT의 Y, INT의 Z, INT w) { 11 가장자리 [E] = .nex헤드 [X]; 12 가장자리 [E] .TO = Y; 13 가장자리 [E] .LEN = Z; 14 가장자리 [E] .cost = w; 15 헤드 [X] = E ++ ; 16 일 경우 (E 및 1 ) (Y, X, 추가 0 - w)를; 17 } 18 부울 spfa () { 19 memset 함수 (힘, 0 , 는 sizeof (힘)); 20 memset 함수 (d, OO, 는 sizeof (d)); 21 (D)은 [ 0 ] = 0 ; 22 q.push ( 0 ); (23) 반면 (! q.empty ()) { 24 INT의 K = q.front (); 25 q.pop (); 26 힘 [K]가 = 0 ; (27) 에 대한이 ( int로 , I = - I = 헤드 [K]! 1 ] I = 가장자리 [I]를 .nex) { 28 INT의 V = 가장자리 [I] .TO; 29 의 경우 ((에지 [I] .LEN) && (d [V]> D [K] + 에지 [I] .cost)) { 30 (D) [V] D = [K] + 에지 [I] .cost; 31 에서 [V] = I; 32 의 경우 (! 힘 [V]) { 33 힘 [V] = 1; 34 q.push (V); 35 } 36 } 37 } 38 } 39 리턴 D [t] < 각종; 40 } 41 INT의 dinic () { 42 INT ANS = 0 ; 43 동안 (spfa ()) { 44 INT의 LEN = OO; 45 대 ( int로 된 I = (T)를, I는, 난 = 에지 [ 발 [I] ^ 1 ] .TO) 렌 = 분 (LEN 에지 [ 에서 LEN [I].); 46 + = LEN ANS *D [t]; 47 대 ( int로 된 I = (T)를, 나, 나는 = 에지 [ 발 [I]를 ^ 1 .TO]) { 48 가장자리 [ 에서 [I] = len-. 렌; 49 가장자리 [ 발 [I]를 ^ 1 .LEN + =] 렌; 50 } 51 } 52 리턴 ANS; 53 } 54 INT 의 main () { 55 는 scanf ( " % D % D % D % D % D % D " , N, A, 및 B, F, FA, FB); 56 memset 함수 (헤드 - 1 , 를 sizeof(머리)); (57) 에 대한이 ( int로 I = 1 난 ++; i가 N = < {) (58) 는 scanf ( " %의 D " , t); (59) 추가 ( 0 , I, t, 0 ); (60) 추가 ( 0 , + 난 , N t, F); (61) 추가 (I + N, 2 * n을 + 1 , t, 0 ); 62 의 경우 는 (i <N) 추가 (I, I + 1 , OO, 0 ); 도 63은 경우 는 (i + A는 <n)에 추가 (난은 N + + + 1 , OO, FA)를; 64 의 경우추가 (나는 B를 <N +) (I, I + B + N + 1 , OO, FB); 65 } 66 T = 2 * N + 1 ; 67 의 printf ( " %의 D " , dinic ()); 68 }