BZOJ 1305:答えの[CQOI2009]ダンスダンスのネットワークの最大流量の半分_ _モデル

コード:

// luogu-判定部イネーブル-O2 
の#include <ビット/ STDC ++。H> 
に#define MAXN 400 
の#define INF 10000000 
の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN)
の#define R1( I)Iは
R 2(I)(iがn + 1)#defineする
の#define R3を(I)(I + N + N)
の#define R4(I)(I + N + N + N)
名前空間stdを使用します。
文字列str [100]。  
INT G [MAXN] [MAXN]。
名前空間Dinic { 
    構造体のエッジ{ 
        から、キャップにINT。
        エッジ(INT U = 0、INT V = 0、INT C = 0):(U)から、(V)に、キャップ(C){} 
    }。
    ベクター<INT> G [MAXN]。
    ベクター<エッジ>エッジ。
    キュー<整数> Q; 
    int型VIS [MAXN]、D [MAXN]、CURR [MAXN]。
    int型S、T;
    ボイドaddedge(INT U、V INT、INT C){ 
        edges.push_back(エッジ(U、V、C))、edges.push_back(エッジ(V、U、0)); 
        INT、M = edges.size()。
        G [U] .push_back(M-2)、G [V] .push_back(M-1)。
    } 
    INT BFS(){ 
        memsetの(VIS、0、はsizeof(VIS))。
        D [S] = 0、VIS [S] = 1、Q.push(S)。
        (!Q.empty()){一方
            Q.pop(); int型、U = Q.front()。
            用(INT SZ = G [U] .size()、I = 0; I <SZ; ++ I){ 
                エッジR =縁[G [U] [I]]。
                もし{(VIS [r.to] && r.cap> 0!)
                    VIS [r.to] = 1、D [r.to] = D [U] +1。
                    Q.push(r.to)。
                } 
            } 
        }
        VIS [t]を返します。
    } 
    INT DFS(int型のx、int型CUR){
        IF(X == T)戻りCUR。
        int型のF、流量= 0。
        (INT SZ = G [X] .size()、I = CURR [X];私はSZを<; ++ i)のための{ 
            CURR [X] = I。
            エッジR =縁[G [X] [I]]。
            IF(D [r.to] == D [X] + 1 && r.cap> 0){ 
                F = DFS(r.to、分(CUR、r.cap))。
                。cur- = F、フロー+ = F、エッジ[G [X] [I] CAP- = F、エッジ[G [X] [I] ^ 1]の.cap + = F。
            } 
            IF(CUR <= 0)ブレーク。
        } 
        戻り流。
    } 
    int型maxflow(){ 
        int型フロー= 0。
        (BFS())のmemset(CURR、0、はsizeof(CURR))、フロー+ = DFS(S、INF)、一方、
        流れを返します。
    } 
    ボイド再(){ 
        ため(INT i = 0; I <MAXN; ++ I)G [i]が.clear();
        edges.clear(); 
    } 
}。   
N INT、K。
BOOLチェック(INT T){ 
    Dinic ::再()。  
    Dinic :: S = 0、Dinic ::トン= 396; 
    (I 1 = int型、iが<= N; I ++){ため
        Dinic :: addedge(R1(I)、R 2(I)、K); 
        Dinic :: addedge(R3(I)、R4(I)、K); 
        Dinic :: addedge(Dinic :: S、R 1(I)、T); 
        Dinic :: addedge(R4(I)、Dinic ::トン、トン)。
        用(INT J = 1; J <= N; ++ j)は{ 
            (G [I] [J])場合
                Dinic :: addedge(R1(I)、R4(j)は、1)。
                Dinic :: addedge(R2(I)、R3(j)は、1);  
        } 
    } 
    Dinic :: maxflow()==のt * nを返します。
} 
int型のmain(){ 
    // setIO( "入力")。
    scanf関数( "%d個の%のD"、&N&K)。
    {(; iが<= N I ++ I = 1 INT)のため
        のscanf( "%sの"、STR + 1)。
        用(INTのJ = 1; J <= N; ++ j)は(STR [J] == 'Y')Gなら[I] [J] = 1。
    } 
    int型のL = 1、R = N、中間、ANS = 0。
    一方、(L <= R){ 
        半ば=(L + R)>> 1。
        (チェック(MID))であればANS =中間、L =ミッド+ 1。
        他に、R =半ば1; 
    } 
    のprintf( "%dの"、ANS)。
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/10943672.html