トピックへのリンク: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 = - 1。CH = GETCHAR()。} 24 ながら、(CH> = ' 0 ' && CH <=の' 9 '){X = X * 10 + CH - 48。CH = 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 }