[hdu6598]調和のとれた軍

削除したいどのように多くの検討最小カット値で、すべての値を足しまず、ネットワークフロー・チャートをビルドします、ソースは各兵士にサイド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(00x3f3f3f3f))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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11260554.html