ネットワークの最大流量 - 最大のネットワークフローテンプレート

トピックリンク

質問の意味:

図は、ネットワークを与え、ソース及びシンクは、ネットワークは、その最大流量を求めます。

ソリューション:

最大流量ネットワークフローテンプレートを探しています

コード:

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 INF = 0x3f3f3f3f const  int型 MAXM = 1E7 + 5 const  int型 MAXN = 1E6 + 5 INTのN、M、K。
構造体ノード{ 
    LLさt、キャップ、流れ、次。    // キャップ容量、流量流れる
} E [MAXM]。
int型のヘッドは、[MAXN]、[MAXN]、CNT cur変換します。// CUR优化DFS中的ヘッド
ボイドアドオン(int型のu、int型の V、int型のキャップ)    //U-> V容量CAP 
{ 

    E [CNT] =ノード{V、CAP、0 、ヘッド[U]}; 
    頭部[U] = CNT ++ ; 
    E [CNT] =ノード{U、00、ヘッド[V ]}; // 裏面0の容量 
    ヘッド[V] = CNT ++ ; 
} 
int型 DEP [MAXN];     // BFS深
BOOL BFS(int型の S、INT T)    // O(N-M +)の
{ 
    memsetの( DEP、0はsizeof (DEP)); 
    キュー < INT > Q; 
    q.push(S); 
    DEP [S] =1 ;
    一方、(!q.empty())
    { 
        int型、U = q.front(); q.pop()。
        int型 ;〜I; I =ヘッド[U] I = E [I] .next)
        { 
            int型、V = E [I] .T。
            もし(DEP [V] == 0 && E [I]の.cap-E [I] .flow> 0 
            { 
                DEP [V] = DEP [U] + 1 
                q.push(V); 
            } 
        } 
    } 
    戻り DEP [T]> 0// 存在增广路
} 
LL DFS(int型Sは、int型T、LL minedge)
{ 
    IF(S == T)戻りminedgeと、
    LLフロー = 0 ;     // 現在の点の流出流量の
    ためのINT&CUR = I [S];〜I; I = E [ I] .next)
    { 
        int型 V = E [I] .T;
         IF(DEP [V] == DEP [S] + 。1 && E [I]の.cap-E [I] .flow> 0// 階層&&余剰流
        { 
            LLのTEMP = DFS(V、T、分(minedgeフロー、E [I] .cap- E [I] .flow)); 
            E [I] .flow + = TEMP;     //は、トラフィックを増加させます 
            E [I ^1 ] .flow- = TEMP;     // 逆側流減少 
            フロー+ = TEMP;     // 割り当てられたトラフィックフロー
            IF(フロー== minedge)を返すフロー;   //は、最大流量の祖先に達し、もはや大、カットしません分岐
        } 
    } 
    IF(流れ== 0)DEP [S] = 0 ;    //は、この時点でもはや流れないオフマーク
    戻り流; 
} 
LL Dinicは、(int型 Sは、INT T)    // 逆側キャップを確立する必要があります= 0 
{ 
    LL MaxFlow = 0 ;
     一方(BFS(S、T))    // が増強パス
     {
        memcpy(CUR、ヘッド、はsizeof(ヘッド))。   // 重要的优化 
        maxflow + = DFS(S、T、INF)。
    } 
    戻りmaxflow。
} 
ボイドのinit()
{ 
    memsetの(頭、 - 1はsizeof ヘッド)
    CNT = 0 ; 
} 
int型のmain()
{ 
    int型N、M、S、T。
    scanf関数(" %D%D%D%D "、&​​N、&M、&S&T)。
    初期化(); 
    以下のためにint型 I = 1 ; I <= M; iは++ 
    {
        int型、U、V、W。
        のscanf(" %D%D%D "、&​​U&V、およびW)
        (U、V、W)を加えます。
    } 
    INT ANS = dinic(S、T)。
    printf(" %d個の\ n " 、ANS)。
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/j666/p/11704165.html