ac-library-rb 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/unittest.yml +16 -0
  3. data/.gitignore +11 -0
  4. data/.rubocop.yml +198 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +116 -0
  7. data/README.ja.md +56 -0
  8. data/README.md +41 -0
  9. data/Rakefile +11 -0
  10. data/ac-library-rb.gemspec +32 -0
  11. data/bin/console +8 -0
  12. data/bin/lock_lib.rb +27 -0
  13. data/bin/setup +8 -0
  14. data/document_en/binary_index_tree.md +3 -0
  15. data/document_en/convolution.md +67 -0
  16. data/document_en/dsu.md +132 -0
  17. data/document_en/fenwick_tree.md +99 -0
  18. data/document_en/index.md +79 -0
  19. data/document_en/lazy_segtree.md +141 -0
  20. data/document_en/math.md +104 -0
  21. data/document_en/max_flow.md +165 -0
  22. data/document_en/min_cost_flow.md +132 -0
  23. data/document_en/modint.md +263 -0
  24. data/document_en/priority_queue.md +119 -0
  25. data/document_en/segtree.md +134 -0
  26. data/document_en/string.md +106 -0
  27. data/document_en/two_sat.md +91 -0
  28. data/document_en/union_find.md +3 -0
  29. data/document_ja/convolution.md +64 -0
  30. data/document_ja/dsu.md +183 -0
  31. data/document_ja/fenwick_tree.md +83 -0
  32. data/document_ja/index.md +89 -0
  33. data/document_ja/lazy_segtree.md +135 -0
  34. data/document_ja/math.md +116 -0
  35. data/document_ja/max_flow.md +129 -0
  36. data/document_ja/min_cost_flow.md +105 -0
  37. data/document_ja/modint.md +349 -0
  38. data/document_ja/priority_queue.md +103 -0
  39. data/document_ja/scc.md +65 -0
  40. data/document_ja/segtree.md +145 -0
  41. data/document_ja/string.md +105 -0
  42. data/document_ja/two_sat.md +87 -0
  43. data/lib/ac-library-rb/version.rb +3 -0
  44. data/lib/convolution.rb +124 -0
  45. data/lib/core_ext/modint.rb +19 -0
  46. data/lib/crt.rb +52 -0
  47. data/lib/dsu.rb +44 -0
  48. data/lib/fenwick_tree.rb +48 -0
  49. data/lib/floor_sum.rb +21 -0
  50. data/lib/inv_mod.rb +26 -0
  51. data/lib/lazy_segtree.rb +149 -0
  52. data/lib/lcp_array.rb +23 -0
  53. data/lib/max_flow.rb +137 -0
  54. data/lib/min_cost_flow.rb +143 -0
  55. data/lib/modint.rb +170 -0
  56. data/lib/pow_mod.rb +13 -0
  57. data/lib/priority_queue.rb +89 -0
  58. data/lib/scc.rb +77 -0
  59. data/lib/segtree.rb +140 -0
  60. data/lib/suffix_array.rb +128 -0
  61. data/lib/two_sat.rb +34 -0
  62. data/lib/z_algorithm.rb +32 -0
  63. data/lib_helpers/ac-library-rb/all.rb +22 -0
  64. data/lib_lock/ac-library-rb.rb +22 -0
  65. data/lib_lock/ac-library-rb/convolution.rb +126 -0
  66. data/lib_lock/ac-library-rb/core_ext/modint.rb +19 -0
  67. data/lib_lock/ac-library-rb/crt.rb +54 -0
  68. data/lib_lock/ac-library-rb/dsu.rb +46 -0
  69. data/lib_lock/ac-library-rb/fenwick_tree.rb +50 -0
  70. data/lib_lock/ac-library-rb/floor_sum.rb +23 -0
  71. data/lib_lock/ac-library-rb/inv_mod.rb +28 -0
  72. data/lib_lock/ac-library-rb/lazy_segtree.rb +151 -0
  73. data/lib_lock/ac-library-rb/lcp_array.rb +25 -0
  74. data/lib_lock/ac-library-rb/max_flow.rb +139 -0
  75. data/lib_lock/ac-library-rb/min_cost_flow.rb +145 -0
  76. data/lib_lock/ac-library-rb/modint.rb +172 -0
  77. data/lib_lock/ac-library-rb/pow_mod.rb +15 -0
  78. data/lib_lock/ac-library-rb/priority_queue.rb +91 -0
  79. data/lib_lock/ac-library-rb/scc.rb +79 -0
  80. data/lib_lock/ac-library-rb/segtree.rb +142 -0
  81. data/lib_lock/ac-library-rb/suffix_array.rb +130 -0
  82. data/lib_lock/ac-library-rb/two_sat.rb +36 -0
  83. data/lib_lock/ac-library-rb/z_algorithm.rb +34 -0
  84. metadata +158 -0
@@ -0,0 +1,141 @@
1
+ # LazySegtree
2
+
3
+ This is a lazy evaluation segment tree.
4
+
5
+ ## Class Methods.
6
+
7
+ ### new(v, e, id, op, mapping, composition)
8
+
9
+ ```ruby
10
+ seg = LazySegtree.new(v, e, id, op, mapping, compositon)
11
+ ```
12
+
13
+ The first argument can be an `Integer` or an `Array`.
14
+
15
+ - If the first argument is an `Integer` of `n`, a segment tree of length `n` and initial value `e` will be created.
16
+ - If the first argument is `a` of `Array` with length `n`, a segment tree will be created based on `a`.
17
+
18
+ The second argument `e` is the unit source. We need to define the monoid by defining the binary operation `op(x, y)` in the block.
19
+
20
+ **Complexity**
21
+
22
+ - `O(n)`
23
+
24
+ ## Instance methods.
25
+
26
+ ## set(pos, x)
27
+
28
+ ```ruby
29
+ seg.set(pos, x)
30
+ ```
31
+
32
+ Assign `x` to `a[pos]`.
33
+
34
+ **Complexity**
35
+
36
+ - `O(logn)`
37
+
38
+ ### get(pos) -> same class as unit source e
39
+
40
+ ```ruby
41
+ seg.get(pos)
42
+ ```
43
+
44
+ It returns `a[pos]`.
45
+
46
+ **Complexity**
47
+
48
+ - `O(1)`
49
+
50
+ ### prod(l, r) -> same class as unit source e
51
+
52
+ ```ruby
53
+ seg.prod(l, r)
54
+ ```
55
+
56
+ It returns `op(a[l], ... , a[r - 1])`.
57
+
58
+ **Constraints**
59
+
60
+ - `0 ≤ l ≤ r ≤ n`.
61
+
62
+ **Complexity**
63
+
64
+ - `O(logn)`
65
+
66
+ ### all_prod -> same class as unit source e
67
+
68
+ ```ruby
69
+ seg.all_prod
70
+ ```
71
+
72
+ It returns `op(a[0], ... , a[n - 1])`.
73
+
74
+ **Complexity**
75
+
76
+ - `O(1)`.
77
+
78
+ ### apply(pos, val)
79
+
80
+ ```ruby
81
+ seg.apply(pos, val)
82
+ ```
83
+
84
+ The implementation with three arguments in the original code is called `range_apply` in this library. If it looks OK after measuring the execution time, we can make the `apply` method support both 2 and 3 arguments.
85
+
86
+ **Constraints**
87
+
88
+ - `0 ≤ pos < n`.
89
+
90
+ **Complexity**
91
+
92
+ - `O(log n)`.
93
+
94
+ ### range_apply(l, r, val)
95
+
96
+ ```ruby
97
+ seg.range_apply(l, r, val)
98
+ ```
99
+
100
+ **Constraints**
101
+
102
+ - `0 ≤ l ≤ r ≤ n`.
103
+
104
+ **Complexity**
105
+
106
+ - `O(log n)`
107
+
108
+ ### max_right.
109
+
110
+ [TODO] Someone with some free time will write.
111
+
112
+ ### min_left
113
+
114
+ [TODO] The code side is not implemented yet.
115
+
116
+ ## Verified
117
+
118
+ This is the link in question. There is no code, but it has been Verified.
119
+ - [AIZU ONLINE JUDGE DSL\_2\_F RMQ and RUQ](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_F)
120
+ - [AIZU ONLINE JUDGE DSL\_2\_G RSQ and RAQ](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_G)
121
+
122
+ The following problem is not AC in Ruby because the execution time is strictly TLE.
123
+ - [ALPC: K \- Range Affine Range Sum](https://atcoder.jp/contests/practice2/tasks/practice2_k)
124
+ - [ALPC: L \- Lazy Segment Tree](https://atcoder.jp/contests/practice2/tasks/practice2_l)
125
+
126
+ ## Reference links
127
+
128
+ - ac-library-rb
129
+ - [Code: lazy_segtree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/lazy_segtree.rb)
130
+ - [Test code: lazy_segtree_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/lazy_segtree_test.rb)
131
+ - AtCoder Library
132
+ - [Document: lazysegtree.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_en/lazysegtree.md)
133
+ - [Documentat: appendix.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_en/appendix.md)
134
+ - [Code: lazysegtree.hpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/atcoder/lazysegtree.hpp)
135
+ - [Test code: lazysegtree_test.cpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/test/unittest/lazysegtree_test.cpp )
136
+
137
+ ## Differences from the original library.
138
+
139
+ ### Not `ceil_pow2`, but `bit_length`.
140
+
141
+ The original C++ library uses the original `internal::ceil_pow2` function, but this library uses the existing Ruby method `Integer#bit_length`. This library uses the existing Ruby method `Integer#bit_length`, which is faster than the original method.
@@ -0,0 +1,104 @@
1
+ # Math
2
+
3
+ It contains number-theoretic algorithms.
4
+
5
+ - `pow_mod`
6
+ - `inv_mod`
7
+ - `crt`
8
+ - `floor_sum`
9
+
10
+ ## pow_mod
11
+
12
+ ```ruby
13
+ pow_mod(x, n, m)
14
+ ```
15
+
16
+ It returns `(x**n) % m`.
17
+
18
+ However, Ruby core has `Integer#pow`. Use it.
19
+
20
+ **Constraints**
21
+
22
+ - `n`, `m` are intergers.
23
+ - `0 ≦ n`, `1 ≦ m`
24
+
25
+ **Complexity**
26
+
27
+ - `O(log n)`
28
+
29
+ ## inv_mod
30
+
31
+ ```ruby
32
+ inv_mod(x, n, m)
33
+ ```
34
+
35
+ It returns an integer `y` such that `0 ≦ y < m` and `xy ≡ 1 (mod m)`.
36
+
37
+ If m is a prime number, Use `x.pow(m - 2, m)`。
38
+
39
+ **Constraints**
40
+
41
+ - `gcd(x, m) = 1`, `1 ≦ m`
42
+
43
+ **Complexity**
44
+
45
+ - `O(log m)`
46
+
47
+ ### Verified
48
+ - [ABC186 E - Throne](https://atcoder.jp/contests/abc186/tasks/abc186_e)
49
+ - [AC Code(59ms) 2020/12/20](https://atcoder.jp/contests/abc186/submissions/18898186)
50
+
51
+ ## crt(r, m) -> [rem , mod] or [0, 0]
52
+
53
+ Chinese remainder theorem
54
+
55
+
56
+ Given two arrays `r`, `m` with length `n`, it solves the modular equation system
57
+
58
+ `x ≡ r[i] (mod m[i]), ∀i ∈ {0, 1, …… n - 1}`
59
+
60
+ If there is no solution, it returns `[0, 0]`.
61
+
62
+ If there is a solution, all the solutions can be written as the form `x ≡ rem(mod)`. it returns `[rem ,mod]`
63
+
64
+
65
+ ## Verified
66
+
67
+ Problems
68
+ - [No\.187 中華風 \(Hard\) \- yukicoder](https://yukicoder.me/problems/no/187)
69
+
70
+ ## floor_sum(n, m, a, b)
71
+
72
+ $\sum_{i = 0}^{n - 1} \mathrm{floor}(\frac{a \times i + b}{m})$
73
+
74
+ It retrurns `Σ[k = 0 → n - 1] floor((a * i + b) / m)`
75
+
76
+ **Complexity**
77
+
78
+ - `O(log(n + m + a + b))`
79
+
80
+ ## Verified
81
+
82
+ [ALPC: C \- Floor Sum](https://atcoder.jp/contests/practice2/tasks/practice2_c)
83
+ - [AC Code 426ms 2020/9/14](https://atcoder.jp/contests/practice2/submissions/16735215)
84
+
85
+ ## 参考リンク
86
+
87
+ - ac-library-rb
88
+ - codes in ac-library-rb
89
+ - [Code pow_mod.rb](https://github.com/universato/ac-library-rb/blob/master/lib/pow_mod.rb)
90
+ - [Code inv_mod.rb](https://github.com/universato/ac-library-rb/blob/master/lib/inv_mod.rb)
91
+ - [Code crt.rb](https://github.com/universato/ac-library-rb/blob/master/lib/crt.rb)
92
+ - [Code floor_sum.rb](https://github.com/universato/ac-library-rb/blob/master/lib/floor_sum.rb)
93
+ - test in ac-library-rb
94
+ - [Test pow_mod_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/pow_mod.rb)
95
+ - [Test inv_mod_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/inv_mod.rb)
96
+ - [Test crt_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/crt.rb)
97
+ - [Test floor_sum_test.rb](https://github.com/universato/ac-library-rb/test/master/lib/floor_sum.rb)
98
+ - AtCoder Library
99
+ - [Code math.hpp](https://github.com/atcoder/ac-library/blob/master/atcoder/math.hpp)
100
+ - [Code internal_math.hpp](https://github.com/atcoder/ac-library/blob/master/atcoder/internal_math.hpp)
101
+ - [Test math_test.cpp](https://github.com/atcoder/ac-library/blob/master/test/unittest/math_test.cpp)
102
+ - [Document math.md](https://github.com/atcoder/ac-library/blob/master/document_ja/math.md)
103
+ - [Document math.html](https://atcoder.github.io/ac-library/document_en/math.html)
104
+ - [Relax the constraints of floor\_sum? · Issue \#33 · atcoder/ac\-library](https://github.com/atcoder/ac-library/issues/33)
@@ -0,0 +1,165 @@
1
+ # MaxFlow
2
+
3
+ Library for solving [Maximum flow problem](https://en.wikipedia.org/wiki/Maximum_flow_problem).
4
+
5
+
6
+ ## Class Methods.
7
+
8
+ ### new(n = 0) -> MaxFlow
9
+
10
+ ```ruby
11
+ graph = Maxflow.new(10)
12
+ ```
13
+
14
+ It creates a graph of `n` vertices and `0` edges.
15
+
16
+ **Complexity**
17
+
18
+ - `O(n)`
19
+
20
+ ## Instance Methods.
21
+
22
+ ### add_edge(from, to, cap) -> Integer
23
+
24
+ ```ruby
25
+ graph.add_edge(0, 1, 5)
26
+ ```
27
+
28
+ It adds an edge oriented from the vertex `from` to the vertex `to` with the capacity cap and the flow amount `0`.
29
+
30
+ It returns an integer `k` such that this is the `k`-th edge that is added.
31
+
32
+ **Complexity**
33
+
34
+ - `O(1)` amortized
35
+
36
+
37
+
38
+
39
+ ### flow(start, to, flow_limit = 1 << 64) -> Integer
40
+
41
+ ```ruby
42
+ (1) graph.flow(0, 3)
43
+ (2) graph.flow(0, 3, flow_limit)
44
+ ```
45
+
46
+ - It augments the flow from `s` to `t` as much as possible. It returns the amount of the flow augmented.
47
+
48
+ **Aliases**
49
+
50
+ - `max_flow`
51
+ - `flow`
52
+
53
+ **Constraints**
54
+
55
+ - `start ≠ to`
56
+
57
+ ### min_cut(start) -> Array(boolean)
58
+
59
+ ```ruby
60
+ graph.min_cut(start)
61
+ ```
62
+
63
+ The return value is an array of length `n`.
64
+
65
+ The `i`-th element of the return value is filled with `true` if the vertex `start` to `i` is reachable by the remainder graph, otherwise it is filled with `false`.
66
+
67
+ **Complexity**
68
+
69
+ - `O(n + m)`, where `m` is the number of added edges.
70
+
71
+ ### get_edge(i) -> [from, to, cap, flow].
72
+
73
+ ```ruby
74
+ graph.get_edge(i)
75
+ graph.edge(i)
76
+ graph[i].
77
+ ```
78
+
79
+ - It returns the current internal state of the `i`-th edge.
80
+ - The edges are ordered in the same order as added by `add_edge`.
81
+
82
+ **Complexity**
83
+
84
+ - `O(1)`.
85
+
86
+ **Aliases**
87
+
88
+ - `get_edge`
89
+ - `edge`
90
+ - `[]`
91
+
92
+ ### edges -> Array([from, to, cap, flow])
93
+
94
+ ```ruby
95
+ graph.edges
96
+ ```
97
+
98
+ - It returns the current internal state of the all edges.
99
+ - The edges are ordered in the same order as added by `add_edge`.
100
+
101
+ **Complexity**
102
+
103
+ - `O(m)`, where `m` is the number of added edges.
104
+
105
+ #### Notes on the `edges` method
106
+
107
+ The `edges` method is `O(m)` because it generates information for all edges.
108
+
109
+ Because of the generation cost, consider using `get_edge(i)` or storing it in a separate variable once, `edges = graph.edges`.
110
+
111
+ ### change_edge(i, new_cap, new_flow)
112
+
113
+ Change the capacity and flow rate of the `i`-th changed edge to `new_cap` and `new_flow`.
114
+
115
+ **Constraints**
116
+
117
+ - `0 ≤ new_fow ≤ new_cap`
118
+
119
+ **Complexity**
120
+
121
+ - `O(1)`
122
+
123
+ ## Verified.
124
+
125
+ - [ALPC: D \- Maxflow](https://atcoder.jp/contests/practice2/tasks/practice2_d)
126
+ - [AC Code 211ms 2020/9/17](https://atcoder.jp/contests/practice2/submissions/16789801)
127
+ - [ALPC: D \fnDroid Sans Fallback - Qiita](https://qiita.com/magurofly/items/bfaf6724418bfde86bd0)
128
+
129
+ ## Reference links
130
+
131
+ - ac-library-rb
132
+ - [Code max_flow.rb(GitHub)](https://github.com/universato/ac-library-rb/blob/master/lib/max_flow.rb)
133
+ - [Test code: max_flow_test.rb(GitHub)](https://github.com/universato/ac-library-rb/blob/master/test/max_flow_test.rb)
134
+ - The original library AtCoder Library
135
+ - Code of the original library
136
+ - [Code: maxflow.hpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/atcoder/maxflow.hpp)
137
+ - [Test code: maxflow_test.cpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/test/unittest/maxflow_test.cpp)
138
+ - Main family documentation
139
+ - [Documentat: maxflow.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_en/maxflow.md)
140
+ - [Documentat: maxflow.html](https://atcoder.github.io/ac-library/document_en/maxflow.html)
141
+ - [Document: appendix.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_en/appendix.md)
142
+
143
+ ## Questions and Answers.
144
+
145
+ ### Why does the `flow_limit` of the `flow` method default to `1 << 64`?
146
+
147
+ I don't remember, and there is no deeper meaning.
148
+ It looks like `Float::MAX` or `Float::INFINITY` might be OK, but won't it slow things down?
149
+
150
+ ### Don't use Struct for edges.
151
+
152
+ Using Struct makes the code slimmer, more advanced, and better looking.
153
+
154
+ However, as a result of measurements, Struc is slow, so we use arrays.
155
+
156
+ ### What is the purpose of a variable that starts with `_`?
157
+
158
+ It's a bit confusing, but there are two separate intentions: 1.
159
+
160
+ 1. `_e` and `_re` are matching variable names to make them easier to read with the original ACL code. 2.
161
+ 2. `_rev` is spit out but not used for the convenience of running `each`, so it starts with `_` with the intention of "not using".
162
+
163
+ ````ruby
164
+ @g[q].each do |(to, _rev, cap)|
165
+ ````
@@ -0,0 +1,132 @@
1
+ # MinCostFlow
2
+
3
+ It solves [Minimum\-cost flow problem](https://en.wikipedia.org/wiki/Minimum-cost_flow_problem).
4
+
5
+ ## Class Methods.
6
+
7
+ ### new(n = 0) -> MinCostFlow
8
+
9
+ ```ruby
10
+ graph = MinCostFlow.new(10)
11
+ ```
12
+
13
+ It creates a directed graph with `n` vertices and `0` edges.
14
+
15
+ Verticle order is the 0-based index.
16
+
17
+ **Constraints**
18
+
19
+ - `0 ≦ n`
20
+
21
+ **Complexity**
22
+
23
+ - `O(n)`
24
+
25
+
26
+ ## Instance Methods.
27
+
28
+ ### add_edge(from, to, cap, cost) -> Integer
29
+
30
+ ```ruby
31
+ graph.add_edge(0, 1, 5)
32
+ ```
33
+
34
+ Adds an edge from vertex `from` to vertex `to` with maximum capacity `cap` and flow rate `0`.
35
+
36
+ The return value is the number of edge added with 0-based index.
37
+
38
+ ### flow(start, to, flow_limit = Float::MAX) -> [flow, cost]
39
+ ### min_cost_max_flow(start, to, flow_limit = Float::MAX) -> [flow, cost]
40
+
41
+ ```ruby
42
+ (1) graph.flow(0, 3)
43
+ (2) graph.flow(0, 3, flow_limit)
44
+ ```
45
+
46
+ The internals are mostly the `slope` method, just getting the last element of the return value of the `slop` method. The constraints and computational complexity are the same as for the `slope` method.
47
+
48
+ **Aliases**
49
+
50
+ - `flow`
51
+ - `min_cost_max_flow`
52
+
53
+ ### slope(s, t, flow_limit = Float::MAX) -> [[flow, cost]]
54
+ ### min_cost_slop(s, t, flow_limit = Float::MAX) -> [[flow, cost]]
55
+
56
+ ```ruby
57
+ graph.slop(0, 3)
58
+ ```
59
+
60
+ **Complexity**
61
+
62
+ - `O(F(n + m) log n)`, where `F` is the amount of the flow and `m` is the number of added edges.
63
+
64
+ **Aliases**
65
+
66
+ - `slope`
67
+ - `min_cost_slope`
68
+
69
+ ### get_edge(i) -> [from, to, cap, flow, cost]
70
+ ### edge(i) -> [from, to, cap, flow, cost]
71
+ ### [](i) -> [from, to, cap, flow, cost]
72
+
73
+ ```ruby
74
+ graph.get_edge(i)
75
+ graph.edge(i)
76
+ graph[i].
77
+ ```
78
+
79
+ It returns the state of the `i`-th edge.
80
+
81
+ **Constraints**
82
+
83
+ - `0 ≤ i < m`.
84
+
85
+ **Complexity**
86
+
87
+ - `O(1)`
88
+
89
+ ### edges -> Array[from, to, cap, flow, cost]
90
+
91
+ ```ruby
92
+ graph.edges
93
+ ```
94
+
95
+ It returns an array containing information on all edges.
96
+
97
+ **Complexity**
98
+
99
+ - `O(m)`, where mm is the number of added edges.
100
+
101
+ ## Verified
102
+
103
+ - [ALPC: E\- MinCostFlow](https://atcoder.jp/contests/practice2/tasks/practice2_e)
104
+ - [1213ms 2020/9/17](https://atcoder.jp/contests/practice2/submissions/16792967)
105
+
106
+ ## Reference links
107
+
108
+ - Our library: ac-library-rb
109
+ - [Code: min_cost_flow.rb](https://github.com/universato/ac-library-rb/blob/master/lib/min_cost_flow.rb)
110
+ - [Test code: min_cost_flow_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/min_cost_flow_test.rb)
111
+ - The original library: AtCoder Library(ACL)
112
+ - [Documentat: mincostflow.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_ja/mincostflow.md)
113
+ - [Code: mincostflow.hpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/atcoder/mincostflow.hpp)
114
+ - [Test code: mincostflow_test.cpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/test/unittest/mincostflow_test.cpp )
115
+
116
+ ## Questions and Answers
117
+
118
+ ## The intent of the aliases is to
119
+
120
+ The method name of the minimum cost flow of the original library is long, so I have an alias for it. The method name of the maximum cost stream in the original library is short, so it is strange.
121
+
122
+ ### What is the purpose of using `Float::MAX` instead of `Float::INFINITY`?
123
+
124
+ I haven't tested it specifically, so I'd like to verify what number is good.
125
+
126
+ I felt that the `Integer` class would be fine.
127
+
128
+ ### Don't use Struct on the edges.
129
+
130
+ Using Struct makes the code slimmer and more advanced, and it looks better.
131
+
132
+ However, I didn't use Struct because it was too slow as a result of measurement.