ボイド add_dinic(INT U、INT V) { E [ ++ CNT] .V = V。 E [CNT] .W = 0 。 E [CNT] .nxt = 頭部[U]。 ヘッド[U] = CNT。 } INT dfs_dinic(int型のx、int型フロー) { 場合(X == ED)戻り流; int型のres = 0 ; 以下のために(INT I [x]は今=; I =! - 1 ; iが= Eを[I] .nxt) { int型 V =E [i]は.V。 もし(D [V] + 1 == D [X] && E [I] .W> 0 ) { int型 K = dfs_dinic(V、分(E [I] .W、流量))。 RES + = K。 フロー - = K。 E [i]は.W - = K。 E [I ^ 1 ] .W + = K。 もし(!フロー)ブレーク。 } } 戻りRES。 } BOOL bfs_dinic() { memsetの(D、0、はsizeof (d)参照)。 キュー }< 整数 > Q; q.push(編); D [ED] = 1 。 しばらく(!q.empty()) { int型のu = q.front(); q.pop(); 用(INT - ;!私は= [U] iはヘッド= 1 ; iは= E [I] .nxt) { int型、V = E [I] .V。 もし(!D [V] && E [I ^ 1 ] .W> 0 ) { q.push(V)。 D [V] = D [U] + 1 。 } } リターン D [ST]> 0 ; } INT dinic() { int型の流量= 0 。 一方、(bfs_dinic()) { ため(intは iが= 0を今[I] = I ++; I <= ED)ヘッド[I]。 流れ = + (ST、INF)dfs_dinic。 } 戻り流; }