削除したいどのように多くの検討最小カット値で、すべての値を足しまず、ネットワークフロー・チャートをビルドします、ソースは各兵士にサイドxの流量を接続兵士をしても、会議の点y側に流れ、各ペア流量とさえ関係は、実際には(これは対称に、Z、式X1を考える+ Y2 + Z = X2 + Y1 + Z = A + C、X1 + X2 = B + C、Y1 + Y2 = A + B縁)、溶液をX1 = X2 =(B + C)/ 2、Y1 = Y2 =(A + B)/ 2、Z =(A + C)/ 2-B対称だっ必ずしも、エッジは2で乗算されます最大流量から2を引いた値で割った値の合計値は、回答を得ることができます
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 505 4 の#defineっ長い長い 5 構造体JI { 6 int型NEX、LEN、であり; 7 }エッジ[N * N]。 8キュー< 整数 > Q; 9 int型E、N、M、X、Y、A、B、C、D [N]、ヘッド[N]、[N]を働きます。 10 ボイド追加(int型のx、int型の Y、int型Z){ 11 エッジ[E] .nex = 頭部[X]。 12 エッジ[E] .TO = Y。 13 エッジ[E] .LEN = Z。 14 頭[X] = E ++ 。 15 場合(E&1)を追加(Y、X、0 ); 16 } 17の BOOL BFS(){ 18 q.push(0 )。 19 のためには、(int型 i = 0 ; iが<= N + 1、iは++)のD [I] = - 1 。 20 D [ 0 ] = 0 。 21 ながら(!q.empty()){ 22 のint、K = q.front()。 23 q.pop()。 24 のために(int型 I =ヘッド[k]を、I =! - 1 ; I = エッジ[I] .nex) 25 であれば((エッジ[I] .LEN)&&(D [エッジ[I] .TO] < 0 )){ 26 D [エッジ[I] .TO] = D [K] + 1 。 27 q.push(エッジ[I] .TO)。 28 } 29 } 30 リターン D [N + 1 ]> = 0 。 31 } 32 INT DFS(INT K、int型の){ 33 であれば(K> n)の戻りS。 34 INTP; 35 のために(INT&I =仕事[K]; I =! - 1 ; I = エッジ[I] .nex) 36 であれば((エッジ[I] .LEN)&&(D [エッジ[I] .TO] == D [K] + 1 )){ 37 、P = DFS(エッジ[I] .TO、分(S、エッジ[I] .LEN))。 38 であれば(P){ 39 エッジ[I] .len- = P。 40 エッジ[I ^ 1 ] .LEN + = P。 41 リターンのp; 42 } 43 } 44 リターン 0 。 45 } 46 のLL dinic(){ 47 のint、K = 0 。 48 LL ANS = 0 。 49 一方(BFS()){ 50 のためには、(int型 iは= 0 ; iは= N + < 1 ; iは++)動作[I] = 頭部[I]。 51 一方(K = DFS(0、0x3f3f3f3f))ANS + = K。 52 } 53の リターンANS。 54 } 55 INT メイン(){ 56 ながら(scanf関数(" %d個の%のD "、&N、&M)!= EOF){ 57の ための(int型 i = 0 ; iが<= N + 1 ; I ++)ヘッド[I] = - 1 。 58 LL ANS = E = 0 。 59 のために(int型 I = 1 ; I <= M Iは++ ){ 60 のscanfを(" %D%D%D%D%D "、およびX&Y、&、&B、&C)。 61 追加(0、X、B + C)。 62 追加(0、Y、B + C)。 63 追加(X、N + 1、A + B)。 64 追加(Y、N + 1、A +B); 65 追加(X、Y、A + C- 2 * B)。 66 追加(Y、X、A + C- 2 * B)。 67の ANS + = A + B + C。 68 } 69 のprintf(" %のLLDを\ n "、ANS-dinic()/ 2 )。 70 } 71 }