Skip to content

Commit 900c671

Browse files
committed
最大流問題の記事を追加する
1 parent 5a55aee commit 900c671

11 files changed

Lines changed: 1014 additions & 2 deletions

_algorithms/dinic.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ description: >
2525

2626
## 概要
2727

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

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

3939
## 関連項目
4040

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

_algorithms/ford-fulkerson.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ description: >
2525

2626
## 概要
2727

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

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

3838
## 関連項目
3939

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
layout: entry
3+
changelog:
4+
- summary: 記事作成
5+
authors: kimiyuki
6+
reviewers:
7+
date: 2021-04-01T00:00:00+09:00
8+
algorithm:
9+
input:
10+
output:
11+
time_complexity:
12+
space_complexity:
13+
aliases: ["最大フロー問題", "maximum flow problem"]
14+
level: blue
15+
description: >
16+
最大流問題とは、与えられたネットワークのフローであって流量が最大のものを求めるという問題。
17+
最大流最小カット定理によって最大流問題の解の流量は最小カット問題の解の容量に等しい。
18+
---
19+
20+
# 最大流問題
21+
22+
## 概要
23+
24+
最大流問題とは、与えられたネットワークのフローであって流量が最大のものを求めるという問題である。
25+
最大流最小カット定理によって最大流問題の解の流量は[最小カット問題](/minimum-cut-problem)の解の容量に等しい。
26+
27+
28+
## 詳細
29+
30+
(省略)
31+
32+
33+
## その他
34+
35+
- フローの定義では「始点から終点へと向かうフローと無関係な位置の閉路状のフローがないこと」は要求されていない。最大流を求めるアルゴリズムはこのような閉路状のフローを含む出力をすることがあるので注意が必要である。なお、最大流問題の解から流量を変えずにこのような閉路状のフローを取り除くことは常に可能である。
36+
37+
38+
## 関連項目
39+
40+
- [最小カット問題](/minimum-cut-problem)
41+
- 最大流最小カット定理によって最大流問題の解の流量は最小カット問題の解の容量に等しい。
42+
- [Dinic 法](/dinic)
43+
- Dinic 法は最大流問題を解くアルゴリズムである。最悪計算量は $O(\lvert V \rvert^2 \cdot \lvert E \rvert)$ だが実用的にはかなり速い。
44+
- [Ford-Fulkerson 法](/ford-fulkerson)
45+
- Ford-Fulkerson 法は最大流問題を $O(F \cdot \lvert E \rvert)$ で解く代表的なアルゴリズムである。

_algorithms/minimum-cut-problem.md

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
---
2+
layout: entry
3+
changelog:
4+
- summary: 記事作成
5+
authors: kimiyuki
6+
reviewers:
7+
date: 2021-04-01T00:00:00+09:00
8+
algorithm:
9+
input:
10+
output:
11+
time_complexity:
12+
space_complexity:
13+
aliases: ["minimum cut problem"]
14+
level: blue
15+
description: >
16+
最小カット問題とは、与えられたネットワークのカットであって容量が最小のものを求めるという問題。
17+
最大流最小カット定理によって最小カット問題の解の容量は最大流問題の解の流量に等しい。
18+
---
19+
20+
# 最小カット問題
21+
22+
## 概要
23+
24+
最小カット問題とは、与えられたネットワークのカットであって容量が最小のものを求めるという問題である。
25+
最大流最小カット定理によって最小カット問題の解の容量は[最大流問題](/maximum-flow-problem)の解の流量に等しい。
26+
27+
28+
## 燃やす埋める問題
29+
30+
競技プログラミングのコミュニティにおいて「燃やす埋める問題」という名前[^moyasu-umeru-local-name]で呼ばれている問題は、最小カット問題に帰着できる問題のひとつである。
31+
これは次のような形の問題である:
32+
33+
- $N$ 個のゴミ $0, 1, 2, \dots, N - 1$ があり、それぞれについて「燃やす」か「埋める」かを選んで処理しなければならない。
34+
ゴミ $i$ は燃やすと $a_i$ 円 ($a_i \ge 0$) かかり埋めると $b_i$ 円 ($b_i \ge 0$) かかる。
35+
さらに、ゴミ $x_j$ を燃やしたときにゴミ $y_j$ を埋めると罰金として $c_j$ 円 ($c_j \ge 0$) かかるという形の条件が $K$ 個与えられている。
36+
このときゴミをすべて処理するのに必要な費用の最小値を求めよ。
37+
38+
燃やす埋める問題はある $N + 2$ 頂点 $2N + K$ 辺のネットワークを考えることで最大流問題に帰着できる。
39+
$N$ 個のゴミをそれぞれ頂点とし、始点 $s$ および終点 $t$ を追加する。
40+
始点 $s$ からそれぞれのゴミ $i$ へ容量 $a_i$ の辺を張り、それぞれのゴミ $i$ から終点 $t$ へ容量 $b_i$ の辺を張り、それぞれの制約 $j$ ごとに頂点 $y_j$ から頂点 $x_j$ へ容量 $c_j$ の辺を貼る。
41+
このネットワーク上での最小カットの容量は燃やす埋める問題の答えに等しい。
42+
このネットワークを図示すると以下のようになる。
43+
44+
![燃やす埋める問題のネットワーク](assets/img/minimum-cut-problem-moyasu-umeru.svg)
45+
46+
47+
## project selection problem
48+
49+
problem selection problem[^project-selection-problem-name] は最小カット問題に帰着できる問題のひとつである。
50+
これは次のような形の問題である:
51+
52+
- $N$ 個のプロジェクト $x_0, x_1, x_2, \dots, x _ {N-1}$ と $M$ 個の機械 $y_0, y_1, y_2, \dots, y _ {M-1}$ がある。
53+
プロジェクト $x_i$ を実行すると利益 $a_i$ 円を産む。
54+
機械 $y_i$ は購入に費用 $b_j$ 円かかる。
55+
さらに、プロジェクト $x _ {c_j}$ を実行するためは機械 $y _ {d_j}$ が購入されていなければならないという形の条件が $K$ 個与えらている。
56+
ただし機械は複数のプロジェクト間で共有できる。
57+
実行するプロジェクトと購入する機械を適切に選択したときの利益の最大値を求めよ。
58+
59+
project selection problem はある $N + M + 2$ 頂点 $N + M + K$ 辺のネットワークを考えることで 最大流問題に帰着できる。
60+
$N$ 個のプロジェクトと $M$ 個の機械をそれぞれ頂点とし、始点 $s$ および終点 $t$ を追加する。
61+
62+
このネットワーク上での最小カットの容量を $F$ とすると project selection problem の答えは $F + \sum_i a_i$ となる。
63+
このネットワークを図示すると以下のようになる。
64+
65+
![project selection problem のネットワーク](assets/img/minimum-cut-problem-project-selection-problem.svg)
66+
67+
68+
## その他
69+
70+
- $s$-$t$ カットは、有向辺の部分集合 $C \subseteq E$ であってどの $s$-$t$ パスも $C$ に含まれるような有向辺を含むものとして定義される場合[^cut-set-of-edges]と、頂点の部分集合 $A \subseteq V$ として定義される場合[^cut-set-of-vertices]とがある。カットの容量は、前者の定義の場合は $C$ に含まれる有向辺の重みの総和として定義され、後者の定義の場合は始点が $A$ に含まれる終点 $V \setminus A$ に含まれるような有向辺の重みの総和として定義される。最小カット問題を考える際にはどちらの定義を用いても解の容量は同じである。
71+
72+
73+
## 関連項目
74+
75+
- [最大流問題](/maximum-flow-problem)
76+
- 最大流最小カット定理によって最小カット問題の解の容量は最大流問題の解の流量に等しい。
77+
78+
79+
## 外部リンク
80+
81+
- <del>[最小カット - CKomakiの日記 - TopCoder部](http://topcoder.g.hatena.ne.jp/CKomaki/20121019/1350663591)</del> (Internet Archive にも保存されておらず現在は閲覧不能)
82+
- <a class="handle">Komaki</a> によるブログ記事。燃やす埋める問題という問題はこの記事で提案されたようである。
83+
- [最小カットを使って「燃やす埋める問題」を解く - SlideShare](https://www.slideshare.net/shindannin/project-selection-problem)<sup>[archive.org](https://web.archive.org/web/20210401023045/https://www.slideshare.net/shindannin/project-selection-problem)</sup>
84+
- <a class="handle">shindannin</a> によるスライド。燃やす埋める問題について分かりやすく説明している。
85+
- [最小カットについて - よすぽの日記](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>
86+
- <a class="handle">yosupo</a> によるブログ記事。最小カット問題はグラフの $2$ 彩色だと思うとよいことが説明されている。
87+
- [『燃やす埋める』と『ProjectSelectionProblem』 - とこはるのまとめ](http://tokoharuland.hateblo.jp/entry/2017/11/12/234636)<sup>[archive.org](https://web.archive.org/web/20210401023114/http://tokoharuland.hateblo.jp/entry/2017/11/12/234636)</sup>
88+
- <a class="handle">tokoharu</a> によるブログ記事。燃やす埋める問題という問題クラスではなく project selection problem という別の問題クラスを利用することを提案している。
89+
- [最小カットを使って「燃やす埋める」問題を解くスライドのフォロー - じじいのプログラミング](https://shindannin.hatenadiary.com/entry/2017/11/15/043009)<sup>[archive.org](https://web.archive.org/web/20210401023113/https://shindannin.hatenadiary.com/entry/2017/11/15/043009)</sup>
90+
- <a class="handle">shindannin</a> によるブログ記事。燃やす埋める問題と project selection problem とを比較している。
91+
- [最小カット問題と充足最大化問題 - うさぎ小屋](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>
92+
- <a class="handle">kimiyuki</a> によるブログ記事。最小カット問題は $\bigvee\mkern-12.5mu\bigvee _ i p_i \to \bigwedge\mkern-12.5mu\bigwedge _ j q_j$ の形の論理式たちの充足最大化問題と見ることができると主張している。
93+
- [燃やす埋める問題と劣モジュラ関数のグラフ表現可能性 その① - 私と理論](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>
94+
- <a class="handle">theory_and_me</a> によるブログ記事。TODO: ちゃんと読んでリンクするかどうか判断する + リンクするなら要約を書く
95+
- [燃やす埋める問題と劣モジュラ関数のグラフ表現可能性 その② グラフ構築編 - 私と理論](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>
96+
- <a class="handle">theory_and_me</a> によるブログ記事。TODO: ちゃんと読んでリンクするかどうか判断する + リンクするなら要約を書く
97+
- [燃やす埋める問題を完全に理解した話 - 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>
98+
- <a class="handle">koyumeishi</a> によるブログ記事。TODO: ちゃんと読んでリンクするかどうか判断する + リンクするなら要約を書く
99+
100+
101+
## 注釈
102+
103+
[^moyasu-umeru-local-name]: 競技プログラミングのコミュニティ外では通用しない名前であることに注意したい。
104+
[^project-selection-problem-name]: TODO: 出典を探す
105+
[^cut-set-of-edges]: R. J. ウィルソン. グラフ理論入門. 近代科学社, 2001, [ISBN978-4-76-490296-1](https://iss.ndl.go.jp/api/openurl?isbn=9784764902961).
106+
[^cut-set-of-vertices]: R. Diestel, [Graph Theory](https://www.springer.com/jp/book/9783662536216), 5th ed. Berlin Heidelberg: Springer-Verlag, 2017. TODO: そうらしいんだけど私はこの本を持ってないので noshi91 に確認する

_sass/user-colors.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// THIS FILE IS GENERATED BY user-ratings.py! DO NOT EDIT!
22
@import "rating-colors";
33
.handle { font-weight: bold; }
4+
.user-Komaki { color: $rating-color-orange; }
45
.user-MiSawa { color: $rating-color-green; }
56
.user-chokudai { color: $rating-color-red; }
67
.user-drken { color: $rating-color-orange; }
@@ -14,6 +15,7 @@
1415
.user-kanra824 { color: $rating-color-yellow; }
1516
.user-kimiyuki { color: $rating-color-orange; }
1617
.user-kort0n { color: $rating-color-red; }
18+
.user-koyumeishi { color: $rating-color-yellow; }
1719
.user-kuretchi { color: $rating-color-blue; }
1820
.user-kuuso { color: $rating-color-blue; }
1921
.user-minaminao { color: $rating-color-yellow; }
@@ -22,11 +24,14 @@
2224
.user-noshi91 { color: $rating-color-red; }
2325
.user-potetisensei { color: $rating-color-orange; }
2426
.user-rsk0315 { color: $rating-color-yellow; }
27+
.user-shindannin { color: $rating-color-blue; }
2528
.user-sigma425 { color: $rating-color-red; }
2629
.user-sky58 { color: $rating-color-red; }
2730
.user-snuke { color: $rating-color-red; }
2831
.user-tempura0224 { color: $rating-color-red; }
32+
.user-theory_and_me { color: $rating-color-blue; }
2933
.user-tmaehara { color: $rating-color-black; }
34+
.user-tokoharu { color: $rating-color-orange; }
3035
.user-udon1206 { color: $rating-color-blue; }
3136
.user-uwi { color: $rating-color-red; }
3237
.user-yosupo { color: $rating-color-red; }

assets/img/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Tikz/PGF
2+
*.aux
3+
*.div
4+
*.log
5+
*.pdf

assets/img/README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,19 @@
33
## この README.md について
44

55
後から画像を修正する必要が発生したときのために、画像の編集方法をこのファイルに書いておきましょう。
6+
7+
8+
## minimum-cut-problem
9+
10+
TikZ/PGF を使っています。
11+
以下のようにコンパイルしてください。
12+
13+
```console
14+
$ pdflatex minimum-cut-problem-moyasu-umeru.tex
15+
$ pdf2svg minimum-cut-problem-moyasu-umeru.pdf minimum-cut-problem-moyasu-umeru.svg
16+
```
17+
18+
```console
19+
$ pdflatex minimum-cut-problem-project-selection-problem.tex
20+
$ pdf2svg minimum-cut-problem-project-selection-problem.pdf minimum-cut-problem-project-selection-problem.svg
21+
```

0 commit comments

Comments
 (0)