class NgLib:: MaxFlowGraph(Cap)

Defined in:

nglib/graph/max_flow.cr

Constructors

Instance Method Summary

Constructor Detail

def self. new (n : Int ) #

$n$ 頂点 $0$ 辺のグラフを作ります。

n = 10
graph = MaxFlowGraph(Int64).new(n)

[ View source ]
def self. new #

$0$ 頂点 $0$ 辺のグラフを作ります。

graph = MaxFlowGraph(Int64).new

[ View source ]

Instance Method Detail

def add_edge (from : Int , to : Int , cap : Cap) : Int32 #

頂点 from から頂点 to へ最大容量 cap 、流量 $0$ の辺を追加します。

何番目に追加された辺であるかを返します。

n = 10
graph = MaxFlowGraph(Int64).new(n)
graph.add_edge(0, 1, 1) # => 0
graph.add_edge(1, 3, 2) # => 1
graph.add_edge(5, 6, 8) # => 2

[ View source ]
def change_edge (i : Int , new_cap : Cap, new_flow : Cap) #

$i$ 番目に変更された辺の容量、流量をそれぞれ new_cap , new_flow に変更します。

他の辺の容量、流量は変更しません。


[ View source ]
def edges #

今の内部の辺の状態を返します。

辺の順番は #add_edge での追加順と同じです。


[ View source ]
def flow (s : Int , t : Int , flow_limit : Cap) #

頂点 $s$ から頂点 $t$ へ流せるだけ流し、流せた量を返します。

複数回呼ぶことも可能ですが、同じ結果を返すわけではありません。 挙動については以下を参考にしてください。

  • https://atcoder.github.io/ac-library/document_ja/appendix.html
n = 4
graph = MaxFlowGraph(Int64).new(n)
graph.add_edge(0, 1, 10) # => 0
graph.add_edge(1, 2, 2)  # => 1
graph.add_edge(0, 2, 5)  # => 2
graph.add_edge(1, 3, 6)  # => 3
graph.add_edge(2, 3, 3)  # => 4

graph.flow(0, 3, 6)   # => 6
graph.flow(0, 3, 100) # => 9  (本来の挙動であれば 3 を返します。)

ameba:disable Metrics/CyclomaticComplexity


[ View source ]
def flow (s : Int , t : Int ) #

頂点 $s$ から頂点 $t$ へ流せるだけ流し、流せた量を返します。

複数回呼ぶことも可能ですが、同じ結果を返すわけではありません。 挙動については以下を参考にしてください。

  • https://atcoder.github.io/ac-library/document_ja/appendix.html
n = 4
graph = MaxFlowGraph(Int64).new(n)
graph.add_edge(0, 1, 10) # => 0
graph.add_edge(1, 2, 2)  # => 1
graph.add_edge(0, 2, 5)  # => 2
graph.add_edge(1, 3, 6)  # => 3
graph.add_edge(2, 3, 3)  # => 4

graph.flow(0, 3) # => 9

[ View source ]
def get_edge (i : Int ) #

今の内部の辺の状態を返します。

辺の順番は #add_edge での追加順と同じです。


[ View source ]
def min_cut (s : Int ) #

長さ $n$ の配列を返します。 $i$ 番目の要素には、頂点 $s$ から $i$ へ残余グラフで到達可能なとき、またその時のみ true を返します。

#flow(s, t) flow_limit なしでちょうど一回呼んだ後に呼ぶと、 返り値は $s, t$ 間の mincut に対応します。


[ View source ]
def size : Int32 #

[ View source ]