ちょうどそれの実践に取り組んでいます。
https://www.luogu.org/problem/P3376ネットワークフロー最大流量ボード。
プログラムの大からの参照の一部A_Comme_Amourの大幅な問題に対する解決策。
Dinic:
T層割り当てられた場合は、再度の成層BFSから実行している1、2に進みます。
2.実行して、DFS、電流の流れを見つけ、その答えを追加しました。詳細は3をご覧くださいについて。
まず3.dfsは、(uは、T、LIM)は(シンク、最小アーク経路を現在の点)を表し、2つのケースを判断する:(1シンクに、即ち最小アークをU == T 2 0そのLIM == 0、直接LIM返すことができます)
そして、DFSを実行します。どの方向に行きますか?(この時、層化するために、その時点で新しいポイント+1深さが古いと(DFS(V、T = F行くことができ、分(LIM、W))、それが)増強パスを見つけるために、ある更新パス:同じ経路-f、LIM + F、フロー+ F、LIM-F、最後の戻り流ダウン広い獲得する必要はありません0以下であるか否かを決定逆。
4.最後に、戻り流などが挙げられます。
アークは、特定の手順を参照して、少し詳細を最適化するように選択することができます。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <キュー> 5 使って 名前空間STDを、 6 のconst int型 INF = 1E9。 7 のconst int型 N = 1E6 + 10 。 8 int型 N、M、S、T、CNT = - 1 、maxflow、ヘッド[N]、CUR [N]、深い[N]。 9キュー< 整数 > Q; 10 構造体端{ 11 、INT 、隣、W。 12 } E [N * 2 ]。 13 のボイドaddedge(INT から、INTに、INT W){ 14 E [++ CNT] =(エッジ){に、[先頭から]、W}。 15 [先頭から =] CNT。 16 } 17 INT BFS(INT S、INT T){ // 将图分层。 18 用の(int型 i = 1 ; iが<= N; I ++)は深い[I] = 1E9 + 10 。 19 しばらく(!q.pop()q.empty()); 20 のために(int型 i = 1 ; iが<= N; iが++)CUR [I] =ヘッド[i]は、 21 ディープ[S] = 0 ; 22 q.push(S); 23 ながら(!q.empty()){ 24 INT U = q.front()。 25 q.pop()。 26 のために(int型 I =ヘッド[U]; I =! - 1 ; I = E [I] .next){ 27 のint V = E [I] .TO。 28 であれば(深い[V]> INF && [I] .W E){ 29 ディープ[V] [U] +深い= 1 。 30 q.push(V)。 31 } 32 } 33 } 34は、 IF(ディープ[T] <INF)リターン trueに、 35 他の 復帰 はfalse ; 36 } 37 [ INT DFS(INT U、INT T、INT LIM){ // リム= minedge(S-> U) 38れる IF(! T || U ==リム)を返すリムを; // 0の右側にシンクまたは右側には、返された場合。 39 INTフロー= 0 、F; 40 用(INT I = CUR [U]; I =! - 1 ; I = E [I] .next){ 41で CUR [U] = I; //アークの最適化 42は、 int型 V = E [I] .TO; 43である IF(ディープ[V] ==ディープ[U] + 。1 &&(DFS = F(V、T、分(LIM、E [I] .W)) )){ // これは層間剥離にシンクと被写体に到達することができる場合 44である フロー+ = F; 45 LIM- = F; 46は、 E [I] .w- = F; 47 E [I ^ 1 ] .W + = F。 48 IF(リム!)BREAK ; 49 } 50 } 51で 返すの流れを、 52はある } // 重要 53は 、ボイド Dinic(INT S、INT T){ 54 ながら(BFS(S、T)){ 55 maxflow + = DFS(S、T、INF)。 56 } 57 } 58 INT メイン(){ 59 のscanf(" %D%D%D%D "、&N、&M、&S&T)。 60 INT X、Y、Z。 61 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 62 のために(int型 I = 1 ; I <= M; iが++ ){ 63 のscanf(" %D%D%D "、およびX&Y、&Z) 64 addedge(X、Y、Z)。 65 addedge(Y、X、0 ); 66 } 67 dinic(S、T)。 68 のprintf(" %dの" 、maxflow)。 69 リターン 0 ; 70 }
もともとISAPが、それと怠惰な、鳩を従事したいと思います。