[ネットワーク]フロー - トラブルdinicを作成します

ちょうどそれの実践に取り組んでいます。

https://www.luogu.org/problem/P3376ネットワークフロー最大流量ボード。

プログラムのからの参照の一部大幅な問題に対する解決策。

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が、それと怠惰な、鳩を従事したいと思います。

 

おすすめ

転載: www.cnblogs.com/Nelson992770019/p/11285448.html