Skip to content

最大流問題や最小カット問題などについて記事を足す #140

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 17 commits into
base: gh-pages
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ Markdown 中に `<a class="handle">chokudai</a>` のように AtCoder ID を書
色の情報は [_sass/user-colors.scss](https://github.com/kmyk/algorithm-encyclopedia/blob/gh-pages/_sass/user-colors.scss) ファイルに CSS として保存されています。このファイルは [scripts/user-ratings.py](https://github.com/kmyk/algorithm-encyclopedia/blob/gh-pages/scripts/user-ratings.py) によって生成されます。定期的に `$ python3 scripts/user-ratings.py` を実行して色の情報のファイルを更新してください。


## 画像ファイル

[`assets/img/`](https://github.com/kmyk/algorithm-encyclopedia/tree/gh-pages/assets/img) に置いてください。
また、後から画像を修正する必要が発生したときのために、画像の編集方法を [`assets/img/README.md`](https://github.com/kmyk/algorithm-encyclopedia/tree/gh-pages/assets/img/README.md) に書いておいてください。

### ローカルでの記事の閲覧

ローカルで記事を閲覧するには、以下のコマンドを順に実行してください。HTTP サーバが建ち <http://127.0.0.1:4000/> から閲覧できます。
Expand Down Expand Up @@ -236,6 +241,7 @@ $ python3 scripts/lint.py
- リンクを張るときはリンク先の永続性に注意する。特に他人のブログ記事や競プロライブラリへのリンクを貼るときは [Internet Archive](https://archive.org/web/) によるスナップショットを取っておく ([Save Page Now - Wayback Machine](https://web.archive.org/save/))。
- リンクを張るときはリンク先との関係が分かるようにする。例題を紹介するならば簡単な解説を書いておく。記事を紹介するならばなぜ他の記事でなくその記事が選ばれているのか分かるようにしておく。
- ソースコードはそのままコピペして動くものを載せる。ソースコードの妥当性は簡単に検証できるようにしておく。
- 画像ファイルは後から他の人が修正しやすいような形式を選び、修正方法のドキュメントを残しておく。


## ライセンスについて
Expand Down
10 changes: 6 additions & 4 deletions _algorithms/dinic.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ algorithm:
input: >
ネットワーク (つまり有向グラフ $G = (V, E)$ および辺容量 $c : E \to \mathbb{R} _ {\ge 0}$ および相異なる頂点 $s, t \in V$)
output: >
$s$-$t$ 最大流 (つまり関数 $f : E \to \mathbb{R} _ {\ge 0}$ であって容量制約とフロー保存則を満たすもの)
$s$-$t$ 最大フロー (つまり関数 $f : E \to \mathbb{R} _ {\ge 0}$ であって容量制約とフロー保存則を満たすもの)
time_complexity: >
最悪計算量は $O(\lvert V \rvert^2 \lvert E \rvert)$ だが実用的にはかなり速い。ネットワークの構造によっては計算量が落ちることがある。
space_complexity:
aliases: []
level: blue
description: >
Dinic 法は最大流問題を解くアルゴリズムのひとつ
Dinic 法は最大フロー問題を解くアルゴリズムのひとつ
残余グラフ上において、辺の本数の意味での $s$-$t$ 最短経路 DAG を BFS により構成し、増加パスをこの DAG の上の DFS により探して流せるだけ流す、という一連のステップを繰り返す。
計算量は $O(\lvert V \rvert^2 \lvert E \rvert)$ だが実用的にはかなり速い。
---
Expand All @@ -25,7 +25,7 @@ description: >

## 概要

Dinic 法は最大流問題を解くアルゴリズムのひとつである
Dinic 法は[最大フロー問題](/maximum-flow-problem)を解くアルゴリズムのひとつである
残余グラフ上において、辺の本数の意味での $s$-$t$ 最短経路 DAG を BFS により構成し、増加パスをこの DAG の上の DFS により探して流せるだけ流す、という一連のステップを繰り返す。

最悪計算量は $O(\lvert V \rvert^2 \lvert E \rvert)$ だが実用的にはかなり速い。また、ネットワークの構造を制限すれば最悪計算量が落ちることがある[^time-complexity]。
Expand All @@ -38,8 +38,10 @@ Dinic 法は最大流問題を解くアルゴリズムのひとつである。

## 関連項目

- [最大フロー問題](/maximum-flow-problem)
- Dinic 法は最大フロー問題を解くアルゴリズムである。
- [Ford-Fulkerson 法](/ford-fulkerson)
- Ford-Fulkerson 法は Dinic 法と並んで競技プログラミングでよく利用される最大流問題を解くアルゴリズムのひとつである。Dinic 法では最短経路 DAG を構成して増加パスをこの DAG の上で探すが、Ford-Fulkerson 法では増加パスを単純な DFS により探す。
- Ford-Fulkerson 法は Dinic 法と並んで競技プログラミングでよく利用される最大フロー問題を解くアルゴリズムのひとつである。Dinic 法では最短経路 DAG を構成して増加パスをこの DAG の上で探すが、Ford-Fulkerson 法では増加パスを単純な DFS により探す。


## 外部リンク
Expand Down
10 changes: 6 additions & 4 deletions _algorithms/ford-fulkerson.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ algorithm:
input: >
辺容量が整数であるネットワーク (つまり有向グラフ $G = (V, E)$ および辺容量 $c : E \to \mathbb{N}$ および相異なる頂点 $s, t \in V$)
output: >
$s$-$t$ 最大流 (つまり関数 $f : E \to \mathbb{N}$ であって容量制約とフロー保存則を満たすもの)
$s$-$t$ 最大フロー (つまり関数 $f : E \to \mathbb{N}$ であって容量制約とフロー保存則を満たすもの)
time_complexity: >
出力の $s$-$t$ 最大流量を $F$ として $O(F \cdot \lvert E \rvert)$
space_complexity:
aliases: []
level: blue
description: >
Ford-Fulkerson 法は最大流問題を解くアルゴリズムのひとつ
Ford-Fulkerson 法は最大フロー問題を解くアルゴリズムのひとつ
増加パスを DFS で探してそこにフローを流していくことを繰り返す。
計算量は出力の $s$-$t$ 最大流量を $F$ として $O(F \cdot \lvert E \rvert)$ である。
---
Expand All @@ -25,7 +25,7 @@ description: >

## 概要

Ford-Fulkerson 法は最大流問題を解くアルゴリズムのひとつである
Ford-Fulkerson 法は[最大フロー問題](/maximum-flow-problem)を解くアルゴリズムのひとつである
残余グラフ上で増加パスを DFS で探しそこにフローを流していくことを繰り返す。
計算量は出力の $s$-$t$ 最大流量を $F$ として $O(F \cdot \lvert E \rvert)$ である。

Expand All @@ -37,8 +37,10 @@ Ford-Fulkerson 法は最大流問題を解くアルゴリズムのひとつで

## 関連項目

- [最大フロー問題](/maximum-flow-problem)
- Ford-Fulkerson 法は最大フロー問題を解くアルゴリズムである。
- [Dinic 法](/dinic)
- Dinic 法は Ford-Fulkerson 法と並んで競技プログラミングでよく利用される最大流問題を解くアルゴリズムのひとつである。Ford-Fulkerson 法では増加パスを単純な DFS により探すが、Dinic 法では最短経路 DAG を構成して増加パスをこの DAG の上で探す。
- Dinic 法は Ford-Fulkerson 法と並んで競技プログラミングでよく利用される最大フロー問題を解くアルゴリズムのひとつである。Ford-Fulkerson 法では増加パスを単純な DFS により探すが、Dinic 法では最短経路 DAG を構成して増加パスをこの DAG の上で探す。


## 外部リンク
Expand Down
45 changes: 45 additions & 0 deletions _algorithms/maximum-flow-problem.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
layout: entry
changelog:
- summary: 記事作成
authors: kimiyuki
reviewers:
date: 2021-04-01T00:00:00+09:00
algorithm:
input:
output:
time_complexity:
space_complexity:
aliases: ["最大流問題", "maximum flow problem"]
level: blue
description: >
最大フロー問題とは、与えられたネットワークのフローであって流量が最大のものを求めるという問題。
最大フロー最小カット定理によって最大フロー問題の解の流量は最小カット問題の解の容量に等しい。
---

# 最大フロー問題

## 概要

最大フロー問題とは、与えられたネットワークのフローであって流量が最大のものを求めるという問題である。
最大フロー最小カット定理によって最大フロー問題の解の流量は[最小カット問題](/minimum-cut-problem)の解の容量に等しい。


## 詳細

(省略)


## その他

- フローの定義では「始点から終点へと向かうフローと無関係な位置に閉路状のフローがないこと」は要求されていない。最大フローを求めるアルゴリズムはこのような閉路状のフローを含む出力をすることがあるので、出力されたフローの構成を利用する際には注意が必要である。なお、最大フロー問題の解から流量を変えずにこのような閉路状のフローを取り除くことは常に可能である。


## 関連項目

- [最小カット問題](/minimum-cut-problem)
- 最大フロー最小カット定理によって最大フロー問題の解の流量は最小カット問題の解の容量に等しい。
- [Dinic 法](/dinic)
- Dinic 法は最大フロー問題を解くアルゴリズムである。最悪計算量は $O(\lvert V \rvert^2 \cdot \lvert E \rvert)$ だが実用的にはかなり速い。
- [Ford-Fulkerson 法](/ford-fulkerson)
- Ford-Fulkerson 法は最大フロー問題を $O(F \cdot \lvert E \rvert)$ で解く代表的なアルゴリズムである。
73 changes: 73 additions & 0 deletions _algorithms/minimum-cut-problem.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
layout: entry
changelog:
- summary: 記事作成
authors: kimiyuki
reviewers:
date: 2021-04-01T00:00:00+09:00
algorithm:
input:
output:
time_complexity:
space_complexity:
aliases: ["minimum cut problem"]
level: blue
description: >
最小カット問題とは、与えられたネットワークのカットであって容量が最小のものを求めるという問題。
最大フロー最小カット定理によって最小カット問題の解の容量は最大フロー問題の解の流量に等しい。
---

# 最小カット問題

## 概要

最小カット問題とは、与えられたネットワークのカットであって容量が最小のものを求めるという問題である。
最大フロー最小カット定理によって最小カット問題の解の容量は[最大フロー問題](/maximum-flow-problem)の解の流量に等しい。


## カットの定義

与えられたネットワークの $s$-$t$ カットの定義としては、大きく分けて以下の 3 種類がある。

1. 有向辺の部分集合 $C \subseteq E$ であってどの $s$-$t$ パスも $C$ に含まれるような有向辺を含むもの[^cut-set-of-edges]
2. 頂点の部分集合 $S \subseteq V$ であって $s \in S$ かつ $t \in V \setminus S$ なもの[^cut-set-of-vertices]
3. 有向辺の部分集合 $C \subseteq E$ であって、次を満たすもの: ある頂点の部分集合 $S \subseteq V$ であって $s \in S$ かつ $t \in V \setminus S$ なものが存在し、$S$ に含まれる頂点から $V \setminus S$ に含まれる頂点への有向辺の全体が $C$ に等しい[^cut-set-of-vertices-as-edges]

カットの容量は、(1.) と (3.) の定義の場合は $C$ に含まれる有向辺の重みの総和として定義される。
(2.) の定義の場合は始点が $S$ に含まれかつ終点が $V \setminus S$ に含まれるような有向辺の重みの総和として定義される。

最小カット問題を考える際にはどの定義を用いても解の容量は同じであるが、カットの定義としてはすべて異なるものである。
(1.) の定義と (2.) の定義との違いはカットの容量の最大値について考えれば明らかである。
(2.) の定義と (3.) の定義とはほとんど同じものであるが、ネットワークが非連結な場合に異なってくる。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

「異なる」が曖昧な気がしていて、もうちょっと具体的に「一般には多対一対応になる」みたいな書き方のほうがよい気がします。あと、有向なので、非連結でなくても多対一になる場合がって、例えば u は接続する辺が (u, s) のみのとき、2. では区別出来る「u が s 側に属するか否か」が 3. では区別できません。

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これも自分のミスです、申し訳ない...

(1.) で定義されるものを (2.) や (3.) で定義されるものから区別したいときには、(1.) で定義されるものを $s$-$t$ 非連結化集合 ($s$-$t$ disconnecting edge set) と呼ぶことがある[^s-t-disconnecting-edge-set]。


## 関連項目

- [最大フロー問題](/maximum-flow-problem)
- 最大フロー最小カット定理によって最小カット問題の解の容量は最大フロー問題の解の流量に等しい。
- [燃やす埋める問題](/moyasu-umeru-mondai)
- 燃やす埋める問題は最小カット問題へと帰着できる。
- [project selection problem](/project-selection-problem)
- project selection problem は最小カット問題へと帰着できる。


## 外部リンク

- [最小カットについて - よすぽの日記](https://yosupo.hatenablog.com/entry/2015/03/31/134336)<sup>[archive.org](https://web.archive.org/web/20210401023012/https://yosupo.hatenablog.com/entry/2015/03/31/134336)</sup>
- <a class="handle">yosupo</a> によるブログ記事。最小カット問題はグラフの $2$ 彩色だと思うとよいことが説明されている。
- [最小カット問題と充足最大化問題 - うさぎ小屋](https://kimiyuki.net/blog/2020/03/07/minimum-cut-and-maximum-satisfiability/)<sup>[archive.org](https://web.archive.org/web/20210401023109/https://kimiyuki.net/blog/2020/03/07/minimum-cut-and-maximum-satisfiability/)</sup>
- <a class="handle">kimiyuki</a> によるブログ記事。最小カット問題は $\bigvee\mkern-12.5mu\bigvee _ i p_i \to \bigwedge\mkern-12.5mu\bigwedge _ j q_j$ の形の論理式たちの充足最大化問題と見ることができると主張している。
- [燃やす埋める問題と劣モジュラ関数のグラフ表現可能性 その① - 私と理論](https://theory-and-me.hatenablog.com/entry/2020/03/13/180935)<sup>[archive.org](https://web.archive.org/web/20210401023205/https://theory-and-me.hatenablog.com/entry/2020/03/13/180935)</sup>, [燃やす埋める問題と劣モジュラ関数のグラフ表現可能性 その② グラフ構築編 - 私と理論](https://theory-and-me.hatenablog.com/entry/2020/03/17/180157)<sup>[archive.org](https://web.archive.org/web/20210401023147/https://theory-and-me.hatenablog.com/entry/2020/03/17/180157)</sup>
- <a class="handle">theory_and_me</a> によるブログ記事。$3$ 変数までの劣モジュラ関数の和 $\sum_i \theta_i(x_i) + \sum _ {i \lt j} \phi _ {i, j} (x_i, x_j) + \sum _ {i \lt j \lt k} \psi _ {i, j, k} (x_i, x_j, x_k)$ で表される関数の最小化問題は最小カット問題に帰着できることを説明している。
- [燃やす埋める問題を完全に理解した話 - koyumeishiのブログ](https://koyumeishi.hatenablog.com/entry/2021/01/14/052223)<sup>[archive.org](https://web.archive.org/web/20210401023419/https://koyumeishi.hatenablog.com/entry/2021/01/14/052223)</sup>
- <a class="handle">koyumeishi</a> によるブログ記事。$2$ 変数間の制約からグラフ表現可能な劣モジュラ関数を自動導出するライブラリを提案している。


## 注釈

[^moyasu-umeru-local-name]: 競技プログラミングのコミュニティ外では通用しない名前であることに注意したい。
[^cut-set-of-edges]: たとえば R. J. ウィルソン. グラフ理論入門. 近代科学社, 2001, [ISBN978-4-76-490296-1](https://iss.ndl.go.jp/api/openurl?isbn=9784764902961).
[^cut-set-of-vertices]: たとえば R. Diestel, [Graph Theory](https://www.springer.com/jp/book/9783662536216), 5th ed. Berlin Heidelberg: Springer-Verlag, 2017.
[^cut-set-of-vertices-as-edges]: たとえば Schrijver, A. [Combinatorial Optimization: Polyhedra and Efficiency](https://www.springer.com/jp/book/9783540443896), Springer Science &amp; Business Media, 2003.
[^s-t-disconnecting-edge-set]: たとえば Schrijver, A. [Combinatorial Optimization: Polyhedra and Efficiency](https://www.springer.com/jp/book/9783540443896), Springer Science &amp; Business Media, 2003.
Loading