[テンプレート]最小コスト最大

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONST  INT nmaxn = 5000 + 8、mmaxn = 50000 + 7 BOOL VIS [nmaxn]。
INT H [nmaxn]、[nmaxn]、EF [nmaxn]、[nmaxn] [nmaxn]、NUMを事前DIS。
構造体の縁{
     int型、にNEX、FL、CO。
} E [mmaxn << 1 ]。
INT S、T、CNT = 0 ボイド追加(INT U、INT V、INT COS、INT FLO){ 
    E [CNT] =(エッジ){V、H [U]、FLO、COS}。
    H [U] = CNT ++ 
} 
BOOL spfa(){ 
    memsetの(DIS、0x3f3f3f3fはsizeof (DIS))。
    EF [S] = 0x3f3f3f3f 
    DIS [S] = 0、VIS [S] = 1 
    事前[T] = 0 ; 
    キュー < 整数 > Q; 
    q.push(S); 
    しばらく(!q.empty()){
         int型のu = q.front(); 
        )(q.pop; VIS [U] = 0 ;
        以下のためのint型I = hの[U]; I =! - 1 ; I = E [I] .nex){
             int型、V = E [I] .TO。
            もし(E [I]の.Fl && DIS [V]> DIS [U] + E [I] .CO){ 
                DIS [V] = DIS [U] + E [i]の.CO。
                事前[V] = U; NUM [V] = I。
                EF [V] = 分(EF [U]、E [I]の.Fl)。
                もし(!VIS [V]){ 
                    q.push(V); 
                    VIS [V] = 1 
                } 
            } 
        } 
    } 
    戻りプレ[t]を。
} 
int型{main()の
    INTの N、M; scanf関数(" %D%D%D%D "、&​​N、&M、&S&T)。
    memsetの(H、 - 1はsizeof (H))。
    以下のためにint型 I = 1 ; I <= M; ++ I){
         int型、U、V、F、W; scanf関数(" %D%D%D%D "、&​​U&V、およびW、およびF)。
        追加(U、V、F、W)、追加(V、U、 -F、0 ); 
    } 
    INT ansf = 0、ANSC = 0 一方、(spfa()){ 
        ansf + = EF [T]。
        ANSC + = EF [T] *DIS [T]。
        以下のためにint型 iはTを=; I = sで、I =!事前[I]){ 
            E [NUM [I]、FL。 - = EF [T]。
            E [NUM [I] ^ 1 ]の.Fl + = EF [T]。
        } 
    } 
    のprintf(" %D%dの" 、ansf、ANSC)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/xiaobuxie/p/11391904.html