[テンプレート] dinicネットワーク最大フローアルゴリズム

ボイド add_dinic(INT U、INT V)
{ 
    E [ ++ CNT] .V = V。
    E [CNT] .W = 0 
    E [CNT] .nxt = 頭部[U]。
    ヘッド[U] = CNT。
} 

INT dfs_dinic(int型のx、int型フロー)
{ 
    場合(X == ED)戻り流;
    int型のres = 0 ;
    以下のためにINT I [x]は今=; I =! - 1 ; iが= Eを[I] .nxt)
    { 
        int型 V =E [i]は.V。
        もし(D [V] + 1 == D [X] && E [I] .W> 0 
        { 
            int型 K = dfs_dinic(V、分(E [I] .W、流量))。
            RES + = K。
            フロー - = K。
            E [i]は.W - = K。
            E [I ^ 1 ] .W + = K。
            もし(!フロー)ブレーク
        } 
    } 
    戻りRES。
} 

BOOL bfs_dinic()
{ 
    memsetの(D、0はsizeof (d)参照)。
    キュー
            }< 整数 > Q; 
    q.push(編); 
    D [ED] = 1 しばらく(!q.empty())
    { 
        int型のu = q.front(); 
        q.pop(); 
        INT - ;!私は= [U] iはヘッド= 1 ; iは= E [I] .nxt)
        { 
            int型、V = E [I] .V。
            もし(!D [V] && E [I ^ 1 ] .W> 0 
            { 
                q.push(V)。
                D [V] = D [U] + 1 
        } 
    }
    リターン D [ST]> 0 ; 
} 


INT dinic()
{ 
    int型の流量= 0 一方、(bfs_dinic())
    { 
        ためintは iが= 0を今[I] = I ++; I <= ED)ヘッド[I]。
        流れ = + (ST、INF)dfs_dinic。
    } 
    戻り流; 
}

 

おすすめ

転載: www.cnblogs.com/thjkhdf12/p/11823731.html