グラフ
G
(
V
,
E
)
{\displaystyle G(V,E)}
にて、
u
{\displaystyle u}
から
v
{\displaystyle v}
への容量
c
(
u
,
v
)
{\displaystyle c(u,v)}
でフロー
f
(
u
,
v
)
=
0
{\displaystyle f(u,v)=0}
とする。ここで、始点
s
{\displaystyle s}
から終点
t
{\displaystyle t}
への最大フローを求める。最終的に、次のような状態となる。
f
(
u
,
v
)
≤
c
(
u
,
v
)
{\displaystyle \ f(u,v)\leq c(u,v)}
:
u
{\displaystyle u}
から
v
{\displaystyle v}
へのフローは容量を超えない。
f
(
u
,
v
)
=
−
f
(
v
,
u
)
{\displaystyle \ f(u,v)=-f(v,u)}
:
u
{\displaystyle u}
と
v
{\displaystyle v}
の間の総フローの性質。
u
{\displaystyle u}
から
v
{\displaystyle v}
へのフローが
a
{\displaystyle a}
、
v
{\displaystyle v}
から
u
{\displaystyle u}
へのフローが
b
{\displaystyle b}
であるとき、
f
(
u
,
v
)
=
a
−
b
{\displaystyle f(u,v)=a-b}
であり、かつ
f
(
v
,
u
)
=
b
−
a
{\displaystyle f(v,u)=b-a}
となる。
∑
v
f
(
u
,
v
)
=
0
⟺
f
i
n
(
u
)
=
f
o
u
t
(
u
)
{\displaystyle \ \sum _{v}f(u,v)=0\Longleftrightarrow f_{in}(u)=f_{out}(u)}
:
s
{\displaystyle s}
と
t
{\displaystyle t}
を除く全てのノード
u
{\displaystyle u}
で成り立つ。あるノードに流れ込むフローとそこから出て行くフローは常に等しい。
すなわち、ネットワーク上のフローは、アルゴリズムの毎回の適用後に常に正当なものとなる。ここで、残余ネットワーク
G
f
(
V
,
E
f
)
{\displaystyle G_{f}(V,E_{f})}
を容量が
c
f
(
u
,
v
)
=
c
(
u
,
v
)
−
f
(
u
,
v
)
{\displaystyle c_{f}(u,v)=c(u,v)-f(u,v)}
で、フローのないネットワークと定義する。ただし、
u
,
v
{\displaystyle u,v}
のフローによって
u
,
v
{\displaystyle u,v}
がクローズ(満杯)となっても
v
,
u
{\displaystyle v,u}
は残余ネットワークに残る可能性があるため、
E
=
E
f
{\displaystyle E=E_{f}}
となるかどうかは定かではない。
アルゴリズム フォード・ファルカーソン
入力 フロー容量
c
{\displaystyle \,c}
、始点
s
{\displaystyle \,s}
、終点
t
{\displaystyle \,t}
のグラフ
G
{\displaystyle \,G}
出力
s
{\displaystyle \,s}
から
t
{\displaystyle \,t}
へのフロー
f
{\displaystyle \,f}
の最大値
全ての枝
(
u
,
v
)
{\displaystyle \,(u,v)}
について
f
(
u
,
v
)
←
0
{\displaystyle f(u,v)\leftarrow 0}
とする。
G
f
{\displaystyle \,G_{f}}
内で
s
{\displaystyle \,s}
から
t
{\displaystyle \,t}
への経路
p
{\displaystyle \,p}
があり、経路上の全ての枝
(
u
,
v
)
∈
p
{\displaystyle (u,v)\in p}
について
c
f
(
u
,
v
)
>
0
{\displaystyle \,c_{f}(u,v)>0}
であるとき:
c
f
(
p
)
=
min
{
c
f
(
u
,
v
)
|
(
u
,
v
)
∈
p
}
{\displaystyle \,c_{f}(p)=\min\{c_{f}(u,v)\;|\;(u,v)\in p\}}
を求める。
(
u
,
v
)
∈
p
{\displaystyle (u,v)\in p}
であるような各枝について
f
(
u
,
v
)
←
f
(
u
,
v
)
+
c
f
(
p
)
{\displaystyle f(u,v)\leftarrow f(u,v)+c_{f}(p)}
(この枝にそってフローを送る)
f
(
v
,
u
)
←
f
(
v
,
u
)
−
c
f
(
p
)
{\displaystyle f(v,u)\leftarrow f(v,u)-c_{f}(p)}
(フローは後で返される)
経路は、
G
f
(
V
,
E
f
)
{\displaystyle G_{f}(V,E_{f})}
について、例えば幅優先探索 や深さ優先探索 を行うことで得られる。前者の場合を特にエドモンズ-カープアルゴリズム と呼ぶ。
フロー増加道をグラフ上で既に確立されているフローに追加していくと、最終的にフロー増加道が見つからなくなり、最大フローが得られる。しかし、そのような状態に到達するかどうかは不確実であり、単にアルゴリズムが完了した場合は解が正しいということしか保証できない。アルゴリズムが無限に実行される場合、そのフローは最大フローに近づいているかどうかも不明である。ただし、そのような状態はフローの値が無理数の場合でしか発生しない。容量が整数の場合、フォード・ファルカーソンの実行時間の上限は O (Ef ) であり、E はグラフ内の枝数、f はグラフの最大フローである。これは、増加道が O (E ) 回まで見つけることができ、毎回少なくともフローが 1 増加するためである。
フォード・ファルカーソンのアルゴリズムの派生として、エドモンズ-カープアルゴリズム がある。これは、終了することが保証されており、最大フローと実行時間が独立で、実行時間は O (VE 2 ) となる。
以下の例は、4ノードのフローネットワークでフォード・ファルカーソンのアルゴリズムを適用する様子を最初の数ステップだけ図示したものである。始点は A で終点は D 。増加道は深さ優先探索 で探し、隣接ノードは辞書順で調べる。この例では、アルゴリズムの最悪ケースを示している。各ステップではフローは1ずつしか増えない。この場合、幅優先探索 で経路を求めると、2ステップで完了する。
経路
容量
フローネットワーク
初期状態のフローネットワーク
A
,
B
,
C
,
D
{\displaystyle A,B,C,D}
min
(
c
f
(
A
,
B
)
,
c
f
(
B
,
C
)
,
c
f
(
C
,
D
)
)
{\displaystyle \min(c_{f}(A,B),c_{f}(B,C),c_{f}(C,D))}
=
min
(
c
(
A
,
B
)
−
f
(
A
,
B
)
,
c
(
B
,
C
)
−
f
(
B
,
C
)
,
c
(
C
,
D
)
−
f
(
C
,
D
)
)
{\displaystyle =\min(c(A,B)-f(A,B),c(B,C)-f(B,C),c(C,D)-f(C,D))}
=
min
(
1000
−
0
,
1
−
0
,
1000
−
0
)
{\displaystyle =\min(1000-0,1-0,1000-0)}
=
1
{\displaystyle =1}
A
,
C
,
B
,
D
{\displaystyle A,C,B,D}
min
(
c
f
(
A
,
C
)
,
c
f
(
C
,
B
)
,
c
f
(
B
,
D
)
)
{\displaystyle \min(c_{f}(A,C),c_{f}(C,B),c_{f}(B,D))}
=
min
(
c
(
A
,
C
)
−
f
(
A
,
C
)
,
c
(
C
,
B
)
−
f
(
C
,
B
)
,
c
(
B
,
D
)
−
f
(
B
,
D
)
)
{\displaystyle =\min(c(A,C)-f(A,C),c(C,B)-f(C,B),c(B,D)-f(B,D))}
=
min
(
1000
−
0
,
0
−
(
−
1
)
,
1000
−
0
)
{\displaystyle =\min(1000-0,0-(-1),1000-0)}
=
1
{\displaystyle =1}
1998ステップ後…
最終的なフローネットワーク
経路 A,C,B,D を見つけたとき、C から B へフローが押し戻される点に注意されたい。
^ T. コルメン、R. リベスト、C. シュタイン、C. ライザーソン『アルゴリズムイントロダクション』(第3版)近代科学社、2013年12月17日(原著2009-7-31)。ISBN 476490408X 。