P1935 [대표팀] 로데오 최소 인하 계획

  

제목 설명

최근 부동산 GDOI (아령 또는 바보의 그룹) NOI (견과류 오래된 바보)의 손에서 토지 개발의 조각을 얻을 수 있습니다. 그것은이 땅 직사각형 영역 인 것으로 이해된다, 일 양상은 N × M 영역의 더 작은 블록들로 분할 될 수있다. GDOI는이 지역이 개발 상업 및 산업 영역으로 구분되어 있어야합니다. 지형에 따라, 각각의 작은 영역은 광고를 구축하고 산업 분야는 다른 경제적 가치를 얻을 수 있습니다. 보다 구체적으로, i 번째 행의 지역 j 번째 열에 대해, 비즈니스 구역의 건설, AIJ 수입 될 Bij 실적이 될 것입니다 산업 영역을 구축 할 것입니다. 인접의 영역 (I, J)은 k 번째 블럭 (분명 K하게는 4 이상) 유형 (인접하는 격자 공통 양측 지칭) 경우에있어서, 상기 상이한 영역은, 즉 부가적인 이점에 링크 될 수있다 (I 상이한 영역의, j)는이 영역 CIJ 이점 × (k)를 증가시킬 수있다. 조사 교수 Tiger.S, 보수 행렬 A, B 후, C는 이미 알고있다. 당신은 GDOI 최대 혜택 프로그램을 찾는 데 도움이 수 있습니까?

입력 형식

정수의 제 2 막의 입력 각각과 M은 양의 정수이고, N은 각각의 행과 열 영역의 수;

2 N + 1 열에, M 정수의 각 행은, 보수 행렬 비즈니스 지역을 나타내고;

제 N + 1, 2N + 2 열에는, 각 행의 정수 M은 B가 보수 행렬 산업 지역을 나타내고;

2N M 정수의 3N + 1 + 2 행은 추가 수익 인접 매트릭스를 나타낸다 C.

출력 형식

최대 이익을위한 정수 값을 포함하는 출력 단 한 줄.

샘플 입출력

입력 # 1
3 3 
1 2 3 
4 5 6 
7 8 9 
9 8 7 
6 5 4 
3 2 1 
1 1 1 
1 3 1 
1 1 1
출력 # 1
81 


질문의 의미 :이 각 지점 A는 무게에 연결할 수 nm의 포인트도 B도 추가 권한 bij 무게 값을 얻을 수 있습니다 AIJ : 캠프의 각 점을 중심으로 그는 같은 K를하지 않기로 A (명백하게 미만 4) 다음에, 얻어진 가중치 케이 *의 CIJ


같은 다음과 같이 매우 간단하고 작은 작물 m 경우

는 인접 점을 변환 할 수는 같은 추가 웨이트 선택 될 수
만큼만 매트릭스 기판 염색 AB는 (최소 인하 효과를 얻을 수 없다) 최초에도 방식의 반대측에있는 검은 점을 연결
한 다음 무게를 얻기 위해 동일한 지점에 인접 캠프로 변환

도 작은 동안은 작물 m 변형 된 또는이 문제의 약간만큼 당신이 (상관없이 선거 캠프가) 수와 동일 할

선의로 간주 될 수있는 투표의 질문

에 인접한 점과 양방향 측 이 두 지점은 각각 두 개의 서로 다른 값을 기여하는 경우 때문에 , 그래서 두 포인트 양방향 가장자리 사이의 가장자리 에지 중량이 두 값의 합은

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
// BXD 의해 입력 
#DEFINE의 담당자 (나는 A는 b)에 대한 (; 나는 = (b) <I ++는 i가 (a) = INT)
 #DEFINE에 대한 REPP을 (I, a가, b) (I = (a int로 ) I> = (b) - I)
 #DEFINE RI (N)는 scanf ( "%의 D", 및 (N))
 #DEFINE RII (N, M)는 scanf ( "%의 D % d에", N, 및 m)
 #DEFINE의 RIII (N, M, K)는 scanf ( "% D % D % D", 및 N, M, K)
 #DEFINE의 RS (들)는 scanf ( "%의 S ', S);
#DEFINE 줄게 긴 긴
 #DEFINE PB와 push_back
 #DEFINE REP (I, N)에 대한 (I = 0 나타내는 int i가 (N)를 <; 내가 ++)
 #DEFINE의 CLR (A, V)가 memset (A, V,

CONST의  INT N = 4e5 + (44) ;
CONST의  INT의 M = 4e6 + (54) ;
INT D [N];
구조체 에지 {
     INT , 옆, w; 
} E [M << 1 ];
INT의 헤드 [N], CUR [N], CNT = 1 ;
보이드 추가 ( INT의 X, INT의 Y, INT의 z) { 
    E [ ++ CNT = (에지) {예, 헤드 [X] Z}; 
    헤드 [X] = CNT; 
    E [ ++ CNT = (에지) {X, 헤드 [Y], 0 }; 
    헤드 [Y] =  CNT 단계;
}
무효 인 ( INT (X), INT의 Y는 int로 A, INT의 B)을 
{ 
    추가 (X, Y, B - A); 
    D는 [X] - = a 및 
    D [Y] + = a 및 
} 

INT의 레벨 [N];
불리언 BFS ( INT의 S, INT의 t) { 
    memset 함수 (레벨 0 , 를 sizeof 레벨);  < INT > Q; 
    레벨 [S] = 1 ; 
    q.push (S); 
    동안 (! q.empty ()) {
         INT의 POS = q.front (); q.pop ();
         ( int로 , I, I = 헤드 [POS] I = E [i]는 다음 내용) {
             INT NX = E [I] .TO;
            경우 (예를 [I] .W || 수준 [NX]!) 계속 ; 
            레벨 [NX] = 레벨 [POS] + 1 ; 
            q.push (NX); 
        } 
    } 
    리턴 레벨 [의 t]; 
} 
INT DFS ( INT S, INT의 t, INT의 흐름) {
     경우 (S == t || 흐름 == 0 ) 리턴 흐름; 

    INTRET = F, 0 ;
     ( INT 및 I = CUR [S], V, I, I = E [i]는 다음 내용) { 
         V = E [I] .TO;
        경우 (레벨 [V] == 레벨 [S] + 1 && (F = DFS (V, T, 분 (유량, 예 [I]를 .W)))> 0 ) { 
            E [I]를 .W = - F ; 
            E [I ^ 1 ] .W + = F; 
            유동 = - ; F를 
            RET + = F;
            만약 (! 흐름) 휴식 ; 
        } 
    } 
    반환 RET; 
}
INT의 dinic ( INT의 S, INT의 t) {
     INT RET = 0 ;
    반면 (BFS (S, t))를 memcpy (현재, 머리 를 sizeof CUR), RET + = DFS (S, t, INF);
    반환 RET를; 
} 
int로 N, M, S, T, A, B, C, 합계, S, T; 

INT의 ID ( INT의 X, INT의 Y) 
{ 
     (X- 1 ) * m + Y; 
} 

INT의 MP [ 200 ] [ 200 ];
INT 의 main () 
{ 
    CIN >> >> N m; 
    에스 = N *의 m 개의 + 100 ] = t에서의 S + 1 ; 

    렙 (I, 1 , N) 
    렙 (j, 1 , m)
     경우 ((나는 J +) 1 ) 
    는 scanf ( " %의 D ' , A) 추가 (S, ID (I, J)를, a), 합계 + = a 및
    그밖에 는 scanf ( " %의 D ' , A) 추가 (ID (I, J), t, a), 합계 + = a 및 

    렙 (I, 1 , N) 
    렙 (j, 1 , m)
     경우 (! ((ⅰ J) + 1 )) 
    는 scanf ( " %의 D를 " ), 및 a), (S, ID (I, J를 추가 a), 합계 + = a 및
    그밖에scanf와 ( " %의 D ' , A) 추가 (ID (I, J), t, a), 합계 + = a 및 

    렙 (I, 1 , N) 
    렙 (j, 1 , m)는 scanf ( " %의 D ' , MP [I] [J]); 

    INT DX [] = { 1 - 1 , 0 , 0 };
    INT의 DY [] = { 0 , 0 , 1 , - 1 }; 

    렙 (I, 1 , N) 
    렙 (j, 1 , m) 
    { 
        경우 ((나는 J +) 1 ) 계속 ;

        담당자 (K, 0 , 3 ) 
        { 
            INT (X) = I + DX [K];
            INT Y = J +의 DY [K];
            경우 (X < 1 || Y < 1 || x> N Y를 ||> m) 계속 ; 

            추가 (ID (I, J) ID (X, Y), MP [I] [J] + MP [X] [Y]); 
            추가 (ID (X, Y) ID (I, J), MP [I] [J] + MP [X] [Y]);  + MP = [I] [J] + MP [X] [Y]; 
        } 
    } 
    COUT << sum- dinic (S, t); 

    반환  0 ; 
}
코드보기

 

추천

출처www.cnblogs.com/bxd123/p/11328457.html