[Bzoj1221] 소프트웨어 개발

소스 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는 수건 세정 방법을 나타낸다.
당신은 모든 문제를 해결 할 수 있도록, 당신은 최소의 비용으로 최대의 흐름을 실행할 수 있습니다.

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 }
코드보기

 

추천

출처www.cnblogs.com/PYWBKTDA/p/11357407.html