P1935 [ナショナルチーム]ロデオ最小カット計画

  

タイトル説明

最近の不動産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、 - 100 }。
    int型 DY [] = { 001、 - 1 }。

    担当者(I、1 、n)の
    担当者(J、1 、M)
    { 
        場合((iはJ +)&1続けます

        担当者(K、03 
        { 
            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 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/bxd123/p/11328457.html