제목 설명
최근 부동산 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.
출력 형식
최대 이익을위한 정수 값을 포함하는 출력 단 한 줄.
샘플 입출력
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
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 ; }