費用の流れ
逆にどのような状況下では考えていません
三点、$ 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、シンク、1、0 ); もし([I] [J] == 0 || [I] [J] == 2 ){ インサート(I、TOT、1、0 ); ID [j] [i]は = CNT - 1 。 } もし([I] [J] == 1 || [I] [J] == 2 ){ インサート(J、TOT、1、0 ); 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。?0:1 )。 } のprintf(" %のC "、J == N - 1?' \ N ':' ' )。 } } 戻り 0 。 }