bzoj2127happiness(最小割)

最小カット。

図は、次のようにもっと建て欠場します:

ソースは、さらにミーティングポイント理論は、ADDE(S、ID(i、j)は、[I] [J])、ADDE(ID(i、j)は、T、B [i]は[学校のテキストを表しますJ])は、隣接するシートの選択の同じファミリーの場合には、新しいノードを作成し、学校のテキスト、新しいポイントにもトラフィックTは、その後、エッジINFに接続トラフィックの点への2人の学生値側である場合。理論的には似ています。

#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの>
 に#define FOR(X、Y)(i = 1 int型、iは= xを<; I ++)のためのために(INT J = 1; J <= Y; J ++ )
 のconst  int型 N = 50100、M = 3E5 + 7 使用して 名前空間はstdを、
INTのN、M、T、CNT、TOT、ANS、HD [N]、LV [N]、Q [N]、V [M]、NXT [M]、W [M]。
ボイド ADDE(int型のx、int型の Y、int型Z)
{ 
    V [ ++ CNT] = Y、W [CNT] = Z、NXT [CNT] = HD [x]は、HD [X] = CNTを。
    V [ ++ CNT] = X、W [CNT] = 0、NXT [CNT] = HD [Y]、HD [Y] = CNT。
} 
ブールBFS()
{ 
    int型 QS = 0、QE = 1 
    memset(qは、0はsizeof Q)。
    memset(LV、0はsizeof LV)。
    Q [ 0 ] = 0、LV [ 0 ] = 1 ;
    一方で(QS < QE)
    { 
        int型、U = Q [QS ++ ]。
        もし(U == T)ブレーク以下のためにint型 I = HD [U]; I; I = NXT [I])
         であれば(W [i]が&& LV [V [I]]!){LV [V [i]は] =のLV [U] + 1 ; Q [QE ++] =V [I];} 
    } 
    もし(LV [T])リターン 1リターン 0 ; 
} 
INT DFS(INT U、INT 低い)
{ 
    場合(!U == T ||低い)を返す低いです。
    int型の合計= 0 ;
    int型 I =; I I = HD [U] [I] NXT)の
     場合(W [i]は&& LV [V [I]] == LV [U] + 1 
    { 
        int型 TMP = DFS(V [I ]、分)(W [i]は、低いです)。 [i]はW + = TMP、低= TMP、 - [I ^ W = TMP、1 ] + = TMP。
        もし(!低)リターン合計。
    } 
    であれば(低い)LV [U] = - 1 戻り値の合計。
} 
int型の ID(int型のx、int型の Y){ リターン(X- 1)* M + Y;}
 int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N、&M)。
    T = 5 ×n個×m個+ 1、CNT = 1、TOT = N * M。
    int型のx; 
    (N、M)のscanf(FOR " %のD "、&​​x)は、ADDE(0、ID(i、j)は、X)、ANS + =バツ; 
    (N、M)のscanf(FOR " %のD "、&​​x)は、ADDE(ID(i、j)は、T、X)、ANS + = X。
    FOR(N - 1 、M)
    のscanf(" %dの"、およびX)、TOT ++、ADDE(0、TOT、x)は、ADDE(TOT、ID(i、j)は、1E9)、ADDE(TOT、ID(I + 1、j)は、1E9)、ANS + = X。
    FOR(N - 1 、M)
    のscanf(" %dの"、およびX)、TOT ++、ADDE(TOT、T、X)、ADDE(ID(i、j)は、TOT、1E9)、ADDE(ID(I + 1、 J)、TOT、1E9)、ANS + = X。
    FOR(N、M - 1 
    のscanf(" %dの"、&​​x)は、TOT ++、ADDE(0、TOT、x)は、ADDE(TOT、ID(i、j)は、1E9)、ADDE(TOT、ID(I、J + 1)、1E9)、ANS + = X。
    (N、M FOR - 1 
    のscanf(" %dの"、およびX)、TOT ++、ADDE(TOT、T、X)、ADDE(ID(i、j)は、TOT、1E9)、ADDE(ID(I、J + 1)、TOT、1E9)、ANS + = X。
    一方、(BFS())ans- = DFS(0 、1E9)。
    printf(" %dの" 、ANS)。
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/hfctf0210/p/10953537.html