bzoj2597

費用の流れ

逆にどのような状況下では考えていません

三点、$ 2 $リングの程度が3を形成しないためのポイント

提供度$の$ X $は、3員環は$ \ FRAC {D_X(D_X-1)} {2} $であり、形成しない$を、D_X

ビル地図1辺がポイントである、片側は側である、$エッジの$ 1 $ 0 $コストのさえ容量交換する側

点は、対応する側に接続されています

ポイントへの原点でも$ N-1 $エッジを、増分コスト

ストリームを実行している最小のコストは、合計マイナス答えです

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 MAXN = 1E4 + 5、INF = 0x3f3f3f3f 構造体の縁{
     INT NXT、F、Cであり; 
} E [MAXN * 100 ]。
整数 N、M、K、ソース、シンク、CNT = 1 INT [MAXN]頭[MAXN]、PREE、前[MAXN]、VIS [MAXN]、D [MAXN]。
インラインボイドリンク(INT U、INT V、INT F、int型のC){ 
    E [ ++ CNT] .nxt = 頭部[U]。
    ヘッド[U] =CNT; 
    E [CNT] .F = F。
    E [CNT] .TO = V。
    E [CNT] .C = C。
} 
インラインボイドインサート(INT U、INT V、INT F、int型のC){ 
    リンク(U、V、F、C)。
    リンク(V、U、0、 - C)。
} 
ブールspfa(){ 
    memsetの(D、 - 1はsizeof (d)参照)。
    D [ソース] = 0 ; 
    キュー < 整数 > Q; 
    q.push(ソース)。
    しばらく(!q.empty()){
         int型のu = q.front(); 
        q.pop(); 
        VIS [U] = 0 ;
        INT iはヘッド= [U]; iは、iは= E [I] .nxtを){
             場合(E [I] .F &&(D [E [i]は.TO]> D [U] + E [I ] .C || D [E [i]は.TO] == - 1 )){ 
                PREE [E [i]は.TO] = I。
                   PREV [E [i]は.TO] = U。
                D [E [i]は.TO] = D [U] + E [i]の.C。
                もし(VIS [E [i]は.TO] == 0 ){ 
                    q.push(E [I] .TO)。
                    VIS [E [i]が.TO] =1 ; 
                } 
            } 
        } 
    } 
    戻りD [シンク]。
} 
インラインINT Edmonds_Karp(){
     int型 ANS = 0 一方、(spfa()){
         int型今=シンク、デルタ= INF。
        一方、(!今= ソース){ 
            デルタ = 分(デルタ、E [今PREE [] F。)。 = 前[今]。
        }  = シンク。
        しばらく(今!= ソース){
            E [PREE [今] F。 - = デルタ。
            E [PREE [今] ^ 1 ] .F + = デルタ。 = 前[今]。
        } 
        ANS + =デルタ* D [シンク]。
    } 
    戻りANS。
} 
int型 [ 105 ] [ 105 ]、ID [ 105 ] [ 105 ]。
int型のmain(){ 
    scanf関数(" %のD "、&n)を。
    ソース = MAXN - 2 
    シンク = MAXN - 1 ;
    以下のためにINT iが= 0 ; I <N; ++ I){
         ためINT J = 0 ; nはJ <; ++ J){ 
            scanf関数(" %のD "、および[I] [J])。
        } 
    } 
    のためのINTは iは= 0、I <N; ++ I){
         ためINT J = 0 ; J <N - 1 ; ++ J){ 
            インサート(ソース、I、1 、J)。
        } 
    } 
    int型TOT = N。
    以下のためにINT iが= 0 ; I <N; ++ I){
         ためINT J = 0 ; J <I; ++ J){ 
            インサート( ++ TOT、シンク、10 );
            もし([I] [J] == 0 || [I] [J] == 2 ){ 
                インサート(I、TOT、10 ); 
                ID [j] [i]は = CNT - 1 
            } 
            もし([I] [J] == 1 || [I] [J] == 2 ){
                インサート(J、TOT、10 ); 
                ID [I] [J] = CNT - 1 
            } 
        } 
    } 
    int型 ANS = N *(N - 1)*(N - 2)/ 6 
    printf(" %D \ n "、ANS - Edmonds_Karp())。
    以下のためにINT iが= 0 ; I <N; ++ I){
         ためINT J = 0 ; nはJ <; ++ J){
             場合(I == j)は{
                printf(" 0 " ); 
            } { 
                のprintf(" %dの"!、ID [I] [J] || E [ID [I] [J] F。?01 )。
            } 
            のprintf(" %のC "、J == N - 1' \ N ''  ' )。
        } 
    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/19992147orz/p/11999852.html