タイトル説明
最近の不動産GDOI(ダンベルそれとも馬鹿のグループ)は、NOI(ナッツ旧馬鹿)手から土地開発の一部を取得します。それはこのランドは、矩形領域であることが理解される、態様は、N×Mの領域のより小さなブロックに分割することができます。GDOIは、これらの分野が発展し、商業や工業の領域に分割されている必要があります。地形によっては、商業、工業地域を構築するための各小領域は、異なる経済的価値を実現することができます。具体的には、i行目の領域j番目の列のために、ビジネス地区の建設は、Aijの収入となり、工業地帯を構築Bijの利益になります。k番目のブロックと隣接する領域の(I、J)は、(隣接する格子は、共通の双方を意味する)(4より明らかK以上ではない)タイプ(I異なる場合、異なる領域は、追加の利点、すなわちに連結することができます地域の、j)は、このエリアには、Cijの給付金×Kを増加させることができます。調査教授Tiger.S後、ペイオフ行列A、B、Cは既に知っています。あなたは最大の利点は、それをプログラムGDOIを見つけることができますか?
入力形式
それぞれの整数の最初の二つの行為の入力、およびMは、それぞれ正の整数N、領域の行および列の数です。
2 N + 1列に、Mの整数の各行は、ペイオフ行列はビジネス地区を表します。
2N + 1列、M、Bは、ペイオフ行列産業分野を表す各行整数に第N + 2。
3N + Mの整数の1行の2N + 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は重みに接続することができるナノメートルの点でもBも追加の権利BIJ重み値を得ることができますAIJ:キャンプの各点を中心に、彼は同じKを持ってしないことを選びました(4より明らかに少ない)、次いで得られた重みのk *のCIJ
として非常にシンプルで小型作物M同じ場合
、それは変換することができ、隣接する点は同じで、追加の重みとなるように選択することができる
唯一のマトリックスボード染色としてABは、(最小カットは何の効果も得られていない)元に、図のように、反対に黒ドットを結ぶ
、次に重みを得るために同じ点に隣接するキャンプに変換し
ながら、図小さく、それが形質転換された作物Mまたは、この問題のほとんどない限り、あなたは(関係なく、どのような選挙陣営が)できるのと同じである
投票の質問ことを誠実に考えることができ
、隣接するドットを双方向側は これらの2つの点がそれぞれ2つの異なる値を貢献する場合ので、その2ポイント双方向エッジ間のエッジ、エッジ重みは、これら2つの値の和であります
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 // BXDによる入力 の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT) の#defineためreppを(I、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(S)のscanf( "%sの"、S); #defineは長い長いっ の#define PBの一back用 の#define REP(I、N)のための(; iが(N)<I ++は、I = 0をINT) の#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] = (エッジ){Y、ヘッド[x]は、Z}。 ヘッド[X] = CNT。 E [ ++ CNT] =(エッジ){X、ヘッド[Y]、0 }。 ヘッド[Y] = CNT。 } ボイドイン(int型のx、int型の yは、int型、int型B)を { 追加(X、Y、B - A)。 D [X] - = 。 D [Y] + = 。 } int型のレベル[N]。 BOOL BFS(INT S、INT T){ memsetの(レベル0、はsizeofのレベル)。 キュー < 整数 > Q; レベル[S] = 1 。 q.push(S); しばらく(!q.empty()){ int型の POS = q.front(); q.pop()。 用(int型 ; I; I =ヘッド[POS] I = E [I] .next){ int型 NX = E [I] .TO。 もし(E [i]が.W ||レベル[NX]!)続けます。 レベル[NX] =レベル[POS] + 1 。 q.push(NX)。 } } リターン・レベル[T]。 } INT DFS(INT S、int型の T、int型フロー){ もし、(S == T ||流れ== 0)リターンフロー; int型F、RET = 0 。 用(INT&I = CUR [S]、V; I; I = E [I] .next){ V = E [I] .TO。 もし(レベル[V] ==レベル[S] + 1 &&(F = DFS(V、T、分(流れ、E [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(CUR、ヘッド、は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 メイン() { CIN >> N >> M。 S = N×m個+100 ; Tが= S + 1 。 担当者(I、1 、n)の 担当者(J、1 、m)の 場合((iは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)&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) { 場合((iは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])。 和 + =融点[I] [J] + MP [X] [Y]。 } } COUT << sum- dinic(S、T)。 リターン 0 ; }