[テンプレート] dijstra最小コストの最大流量

int型CNT;
INT H [MAXN]。
int型の準備[MAXN]。
int型のPREE [MAXM]。
int型のDIS [MAXN]。
int型 ST = MAXN - 2 int型の ED = MAXN - 1 

構造体のエッジ
{ 
    int型V、NXT。
    int型F、W; 
} E [MAXM]。

int型ヘッド[MAXN]。

インラインボイドのinit()
{ 
    memsetの(頭、 - 1はsizeof (ヘッド))。
    CNT = 1 
} 

インラインボイド追加(INT U、int型 V、INT、W int型F)
{ 
    E [ ++ CNT] .V = V。
    E [CNT] .nxt = 頭部[U]。
    ヘッド[U] = CNT。
    E [CNT] .F = F。
    E [CNT] .W = W。
    E [ ++ CNT] .V = U。
    E [CNT] .nxt = 頭部[V]。
    ヘッド[V] = CNT。
    E [CNT] .F = - F。
    E [CNT] .W = 0 
} 

インライン対 < INTINT> dijstra()
{ 
    int型 MAXF = 0 int型ミンク= 0 ;
    一方、1 
    { 
        PRIORITY_QUEUE <ペア< INTINT >> ヒープ。
        memset(DIS、0x3fをはsizeof (DIS))。
        DIS [ST] = 0 ; 
        heap.push(make_pair(0 、ST))。
        しばらく(!heap.empty())
        { 
            ペア < int型int型> X = heap.top()。
            heap.pop(); 
            もし(!-x.first = DIS [x.second])続けますもし(x.second ==編)ブレークINTは - ;!私= iはヘッド[x.secondを] = 1 ; iが= E [I] .nxtを)
            { 
                int型今= E [I] .F + H [x.second] - H [E [I ] .V]。
                もし(E [I] .W> 0 && DIS [E [I] .V]> DIS [x.second] + 今)
                { 
                    DIS [E [I] .V] = DIS [x.second] + 今。
                    heap.push(make_pair( -DIS [E [I] .V]、E [I] .V))。
                    予備校[E [i]は.V] = x.second。
                    PREE [E [I] .V] = I。
                } 
            } 
        } 
        もし(DIS [ED]> = 0x3f3f3f3fブレーク以下のためにINT iが= 0 ; <I = N; I ++)H [I] + = DIS [i]は、
        int型になりました= 0x3f3f3f3f 以下のためにint型私はエドを=;!私= ST;私は= 予備校[i])と
            なりました = 分(。今、E [PREE [I]]ワット)を、
        以下のためのint型 I編=。I = ST!; 私は= 分取[i]は)
        { 
            E [PREEを[I]、W。 - = 今。
            E [PREE [I] ^ 1 ] .W + = 今; 
        } 
        MAXF + = 今。
        ミンク + =今* H [ED]。
    } 
    戻りmake_pair(MAXF、ミンク)。
}

 

おすすめ

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