羅区P3386二部グラフマッチング問題溶液

フェイス質問

この質問は、ハンガリーのアルゴリズムを練習することですが、ネットワークフローオフ、それを切断するために使用することができますが、

私たちは、スーパーソースを構築し、スーパー、左部のスーパーソース接続ポイント、超交換接続ポイントの右部分をシンクすることができます。

最大流量は、それを描く上で実行されます。

PS:私のソースは、2001年のスーパーセットであり、超交換は2002年です。

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
構造体littlestar {
     int型に、
    int型のNXT。
    int型のw; 
}星[ 5000010 ]。
int型のヘッド[ 5000010 ]、CNT; 
インラインボイド追加(INT U、INT V、INT W)
{ 
    星[ ++ CNT] .TO = V。
    スター[CNT] .nxt = ヘッド[U]; 
    星[CNT] .W = W。
    ヘッド[U] = CNT。
    
} 
int型、E、M、N。
INT DIS [ 3010 ]; 
キュー < 整数 > Q; 
インラインブールBFS()
{ 
    memsetの(DIS、0はsizeof (DIS))。
    一方、(q.size()){ 
        q.pop()。
    } 
    q.push(2001 )。
    DIS [ 2001 ] = 1 一方、(q.size()){
         int型、U = q.front()。
        q.pop(); 
        以下のためにint型 ; I I = I =ヘッド[U]は{星[I] .nxt)
             のint Vを=スター[i]は.TO。
            もし(スター[i]が.W &&!DIS [V]){ 
                q.push(V); 
                DIS [V] = DIS [U] + 1 もし(Vの== 2002 ){
                     返す 1 
                } 
            } 
        } 
    } 
    戻り 0 
} 
int型 dinic(INT U、INT フロー)
{ 
    場合(U == 2002 ){
         戻り流; 
    } 
    int型の残り= 流;
    int型TMP;
    (登録をint ; iが残り&& iが= [U] I =ヘッド{星[I] .nxt)
         のint V = スター[I] .TO。
        もし(星[I] .W && DIS [V] == DIS [U] + 1 ){ 
            TMP = dinic(V、分(残り、星[I] .W))。
            もし(!TMP)DIS [V] = 0を
            スター[i]は.W - = TMP; 
            スター[I ^ 1 ] .W + = TMP; 
            残り - = TMP; 
        } 
    } 
    を返す flow- 休息を。
} 
INT maxflow。
int型メイン()
{ 
    scanf関数(" %D%D%D "、&​​N、&M、およびE)。
    ため(登録をint i = 1 ; iは= <N; iは++ ){ 
        (追加2001、I、1 )。
        追加(I、20010 ); 
    } 
    ため(登録をint = I 1を iが++; iが<= M ){ 
        追加(N + I、20021 )。
        (追加2002、N + I、0 ); 
    } 
    のための(レジスタINTi = 1 ; iが= Eを<; Iは++ ){
         int型V、Uと、
        scanf関数(" %d個の%d個"、&​​U&V); 
        (U、N追加 + V、1 )。
        追加(N + V、U、0 ); 
    } 
    int型の流量= 0 一方、(BFS()){
         ながら(流量= dinic(2001999999999))maxflow + = 流量; 
    } 
    COUT << maxflow。
}

 

おすすめ

転載: www.cnblogs.com/kamimxr/p/11331586.html