HDU3605エスケープ(+ライクな圧力最大流量宣告フルフロー)

[タイトル]に意図されています。

Nの個人、Mの惑星は、(i、j)は、N * Mの行列にあり、誰もが離れて移動することができれば、地球ではなく、0は、尋ねることができますjに私のために1です。

[思考]:

Nは、1E6の範囲惑星TLE特定の側に接続され、誰もが、その後、圧力が行列の各行に応じて成形することができるだけ0,1であれば、同一の状態は、アレイIDX SIZ [IDX]にマージされ、

スキャン状態で、かつ地球にもエッジの条件を満たしています。

【図】内蔵。

スーパーソースSP - > IDX右側SIZ [IDX]

IDX - > M右側INF

M - >スーパー容量TPの右側をシンク

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、

const  int型 MAXN = 1E5 + 5 CONST  int型 MAXM = 10 + 5 const  int型 INF = 0x3f3f3f3f INTの N、M、D [MAXN + MAXM]、SIZ [MAXN]。
int型のヘッド[MAXN + MAXM]、TOT、maxflow。
int型のSP、TP。
構造体の縁{
     INT 、次に、Wに対して、
} ED [(MAXN * MAXM + MAXN + MAXM)<< 1 ]。
インラインボイドのinit(){ 
    memsetの(頭、 -1はsizeof (ヘッド))。
    memset(SIZ、0はsizeof (SIZ))。
    TOT = 1 
} 

インラインボイドは(追加INT U、INT V、INT W){ 
    ED [ .TO = V ++ TOT]と、ED【TOT] .W = W。ED【TOT] .next =頭部[U]。ヘッド[U]は= TOTを、
    ED [ ++ TOT] .TO = U; ED【TOT] .W = 0ED【TOT] .next =頭部[V]。ヘッド[V] = TOT。
} 

インラインブールBFS(){ 
    memsetの(D、0はsizeof (d)参照)。
    キュー< 整数 > Q; 
    D [SP] = 1 
    q.push(SP)。
    一方、(!q.empty()){
         int型のx = q.front()。
        q.pop(); 
        以下のためにint型 - ;!I = I =ヘッド[X] 1 ; I = {ED [I] .next)
             INT Y = ED [I] .TO。
            もし(!ED [I] .W && D [Y]){ 
                D [Y] = D [X] + 1 
                q.push(Y)。
                もし(Y軸== TP)リターン 1 
            } 
        } 
    }
    リターン 0 ; 
} 

インラインINT DFS(int型のx、int型フロー){
     場合(X == TP)リターンフロー。
    INTの RES = 流量、K。
    以下のためにint型 - ;!I = I =ヘッド[X] 1 ; && RES I = {ED [I] .next)
         INT Y = ED [I] .TO。
        もし(ED [i]は.W && D [Y] == D [X] + 1 ){ 
            K = DFS(Y、分(ED [I] .W、RES))。
            もし(!k)をD [Y] = 0 ; 
            編[i]は.W- = K。
            ED [I ^ 1 ] .W + = K。
            RES - = K。
        } 
    } 
    戻り flow- RESと、
} 

インラインボイドdinic(){
     int型フロー= maxflow = 0 一方、(BFS())
         しながら(流量= DFS(SP、INF))maxflow + = 流量; 
} 

int型のmain(){
     // freopenは( "in.txt"、 "R"、STDIN)。
    一方、(〜のscanf(" %d個の%のD "、&​​N、&M)){ 
        INIT()。
        int型L = INF、R = - INF。
        以下のためにint型 i = 1 ; iが<= N; iは++ ){
             int型の和= 0 INT J = 1 ; J <= Mであり、j ++ ){
                 int型TMP。
                scanf関数(" %のD "、&TMP)。 << = 1 
                合計 + = TMP; 
            } 
            SIZ [和] ++ ; 
            L =分(L、合計)。R =MAX(R、合計)。
        } 
        SP = 0 
        TP = R + M + 1 以下のためにint型私= 1 ; I <= M; iが++ ){
             int型のつづき。
            scanf関数(" %のD "、&CONT)。
            (I追加 + R、TP、CONT)。
        } 
        のためにint型 I = 1と、iが<= R; iは++ 場合(SIZ [I]){
                 int型の POS = 0 しばらく(POS <M){
                     場合(I&(1 << POS))(I、M-POS +追加R、INF)を、
                    POS ++ ; 
                } 
                追加(SP、I、SIZ [I])。
            } 
        dinic()。
        もし(N <= maxflow)プット(" YES " );
        他のプット(" NO " ); 
    } 

    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/WAautomaton/p/11031958.html