二乗問題アクセス(ネットワークフロー)

グリッド・アクセスの問題(luogu)

解決

「除外」の上のネットワークフローを解決するために使用することができます

最小はすべてのポイントが選択されていることを、あなたは、特定のポイントに合法的なプログラムの選択を選ぶことができないこれらの点に価値の合計を取得するために選択しないと仮定します

最小最小をカットするためにレノボ

図は、2つの部分に分割(+横縦座標)パリティ

それは無限の流れが正である必要がありますので、ポイントカットオフは関係の間で選択することができないことはできないため、「カット」に、 - あなたはポイント(奇数さえ方向)でも側との間で選択することはできません

そして、この点の端縁値の流れの偶数部分に奇数の全ての点から、この点エッジの値の一部でも各点についても、出発点からの流れ

彼は、それが価値を失うため、彼らは投票しなかったと述べました

最大実行フロー(すなわち、最小カット)

コード

 

書式#include <cstdioを> 
する#include <cstdlib> 
書式#include <キュー> 
の#include <アルゴリズム> 
書式#include <CStringの>
 使用して 名前空間をSTD。
CONST  INT N = 1E4 + 10、M = 1E5。
int型のヘッド[N]、版NXT [M]、[M]、エッジ[M]、TOT = 1 INT S、T、N、M、D [N]、X、maxflow、流れ、和、INF = 1 << 30 INT ID(int型のx、int型Y)
{ 
    リターン(X- 1)* M + Y。
} 
無効アドオン(int型U、INT V、INT W)
{ 
    版[ ++ TOT = V、NXT [TOT =頭部[U]、エッジ[TOT =ヘッド、W [U] = TOT。
    版【 ++ TOT = U、NXT [TOT =頭部[V]、エッジ[TOT = 0、ヘッド[V] = TOT。
} 
int型BFS()
{ 
    キュー < INT > Q。
    memsetの(D、0はsizeof (d)参照)。
    D [S] = 1 、q.push(S)。
    一方、(!q.empty())
    { 
        int型のx = q.front()。
        q.pop(); 
        以下のためのint型私はヘッド[x]は、yは=; I;私は= NXTを[I])
             場合(エッジ[I]> 0 && D [Y =!版[I]])
            { 
                D [Y] = D [X] + 1 ; 
                q.push(Y)。
                もし(Y == t)はリターン 1 
            } 
    } 
    戻り 0 
} 
INT dinic(int型のx、int型フロー)
{ 
    場合(X == T)リターンフロー。
    int型休む= 流れ。
    以下のためにINT iがヘッド[x]は、yは=;私は休息&&; I =NXT [I])
         であれば(エッジ[I]> 0 && D [Y =版[I]] == D [X] + 1 
        { 
            int型 K = dinic(Y、分(エッジ[i]が、REST)) ;
            もし(!k)をD [Y] = 0 ; 
            エッジ[I] - = K、エッジ[I ^ 1 ] + = K。
            休息 - = K; 
        } 
    を返す flow- 休息を。
} 
int型のmain()
{ 
    scanf関数(" %D%D "、&​​N、&M)。
    S = 0、T = N * M + 1 以下のためのINT iは= 1 ; iが<= N; I ++ のためのINT J = 1 ; J <= Mであり、j ++ 
        { 
            scanf関数(" %のD "、&x)は、 + = X。
            もし((I + J)%2 
            { 
                追加(ID(i、j)は、T、X)。
                続け; 
            } 
            、(S、ID(i、j)は、X)を加えます。
            もし(I> 1)を追加(ID(i、j)は、ID(I- 1 、j)は、INF)。
            もし(I <N)を追加(ID(i、j)は、ID(I + 1、j)は、INF);
            もし(j> 1)を追加(ID(i、j)は、ID(I、J- 1 )、INF)。
            もし(J <M)を追加(ID(i、j)は、ID(I、J + 1 )、INF)。
        } 
    ながら(BFS())しながら(流量= dinic(sが、1 << 30))maxflow + = 流れます。
    printf(" %D \ n "、sum- maxflow)。
    リターン 0 ; 
}

 

 

 

おすすめ

転載: www.cnblogs.com/hsez-cyx/p/12407490.html