[Bzoj1001] [BeiJing2006]狼はウサギを捕まえました

 

トピックへのリンク:https://www.lydsy.com/JudgeOnline/problem.php?id=1001

、大物の前に二重のグラフです参照してください、dinic、基本dinicが巻き込ま走った後、有向グラフ(0エッジを構築していない)双方向側を構築するために直接QAQを通過した最大規模の水、無ネットワークフローを書きましたあなたは簡単にそれを最適化することができます。

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3 typedefの長い 長いLL。
4  のconst  int型 MAXN = 6E6 + 10 5  のconst  int型 INF = INT_MAX。
6  構造体ノード{
 7      int型のE、W、次。
8  }エッジ[MAXN]。
9  int型ヘッド[MAXN]、lenの;
10  int型D [MAXN]。
11  ボイドのinit(){
 12      のmemset(ヘッド、 - 1はsizeof (ヘッド))。
13      LEN = 0 14  }
 15  空隙追加(int型の、int型の E、INT W){
 16      エッジ[LEN] .E = E。
17      エッジ[LEN] .W = W。
18      エッジ[LEN] .next = 頭部[S]。
19      頭[S] = LEN ++ 20  }
 21インラインint型リード(){
 22      、INT X = 0、F = 1チャー CH = GETCHAR()。
23      しばらく(CH < "0 " || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1CH = GETCHAR()。}
 24      ながら、(CH> = ' 0 ' && CH <=の' 9 '){X = X * 10 + CH - 48CH = GETCHAR()。}
 25      リターンのx *のF。
26  }
 27  BOOL BFS(INT S、int型E){
 28      キュー< INT > Q。
29      のmemset(D、0はsizeof (d)参照)。
30      D [S] = 1 31      q.push(S);
32      ながら(!q.empty()){
 33          、INT X = q.front()。q.pop();
34          のためには、int型 - ;!I = I =ヘッド[X] 1 ; I = {エッジ[I] .next)
 35              のint Y = エッジを[I] .E。
36              であれば(エッジ[I] .W &&!{D [Y])
 37                  D [Y]は、D [X] + = 1 38                  q.push(Y)。
39             }
 40          }
 41      }
 42      リターンD [E]。
43  }
 44  INT DFS(INT S、int型の E、int型の制限){
 45      であれば(S ==のE)
 46          リターンリミット。
47      intが追加、ANS = 0 ;
48      のためには、int型 I =ヘッド[S]と、I =! - 1 ; I = エッジ[I] .next){
 49          のint Y = エッジ[I] .E。
50          であれば(D [S] == D [Y] - 1&&エッジ[I] .W &&(=の追加DFS(Y、E、分(エッジを[I] .W、限界)))){
 51              エッジ[I] .W - = 加えます。
52              エッジ[I ^ 1 ] .W + = 加えます。
53の              ANS + = 加えます。
54              リミット- = 加えます。
55              もし(!リミット)
 56                  ブレーク57          }
 58      }
 59      であれば(ANS)
 60の         リターンANS。
61      D [S] = - 1 62      リターン 0 ;
63  }
64  int型 dinic(INT S、INT E){
 65      INT ANS = 0 、F。
66      一方(BFS(S、E)){
 67          ながら(F = DFS(S、E、INF))
 68の              ANS + = F。
69      }
 70の     リターンANS。
71  }
 72  INT メイン(){
 73      のint N、M、Z。
74      N =)(読み取り、M = 読み取ります();
75      のinit();
76      のためのint型 I = 1; I <= N。I ++ 77          のためのINT J = 1 ; J <Mであり、j ++ ){
 78              、Z = リード()。
79              追加(M×(I - 1)+ J、M×(I - 1)+ J + 1 、Z)。
80              追加(M *(I - 1)+ J + 1、M×(I - 1)+ J、Z)。
81          }
 82      のためにINT i = 1 ; iがn <; I ++ 83          のためのINT J = 1; J <= M。J ++ ){
 84              、Z = リード()。
85              追加(M×(I - 1)+ J、Mの* iが+ J、z)を、
86              追加(m個* iがJ、M *を+(I - 1)+ J、Z)。
87          }
 88      のためのint型 i = 1 ; iがn <; I ++ 89          のためのINT J = 1 ; J <Mであり、j ++ ){
 90              、Z = リード()。
91              追加(M×(I - 1)+ J、Mの* Iがj + 1 、z)を、
92             (M IがJ + + *追加1、M×(I - 1)+ J、Z)。
93          }
 94      のprintf(" %d個の\ n "、dinic(1、N *のM))。
95      // システム( "休止")。
96 }

 

 

おすすめ

転載: www.cnblogs.com/sainsist/p/11115356.html