manasimu 0.0.36 → 0.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82eaccd10f2cf79a10c97f388a08350673a287f547009ed7b033d76a4554290e
4
- data.tar.gz: a64526ba25f0253c76a042bee15d4bb740710e4709cfe0702fdf8b970e6b7771
3
+ metadata.gz: d6ae84013078ea01136343e8a484fdd74e91b52030dbde9d6fd15fe1af8f511b
4
+ data.tar.gz: 4ca268428f78118faa37f018cd993870eb679f2ffffd269137fe256edb021096
5
5
  SHA512:
6
- metadata.gz: df4b845d6a07058d0b4584e713bc6dc5c9e906a4daa3e0d150bb38791da3c677954ceda25aec0e5714b7d2752fa9c2d9291abd64e414adc22b3dbb6ea952c8e9
7
- data.tar.gz: f95acb679e150ddaff4035f26fb0f73d1c06db1b6659f0c523d53ed7f35ecaca3c2d6609d0cb9d3683b117f77a13a05030cecb6f51efc4a9de2e51428f272216
6
+ metadata.gz: '08fe3f4f91088d4fbaa616435c20fb6dce0f4d3dbc0b2912bfd31fd0bf779b0cf80176d743b976e45f461683d46e0018a9c9515f28b9cb5e71b5be59e7fe5770'
7
+ data.tar.gz: 8fcab338010c3c54af5befa679cfa6c6bfe1c480f6cbd62e1574039e7c0f368d39335078ea0dcb68de5978f6c72984b7f207379b9250e9e6359d659314df756e
File without changes
@@ -0,0 +1,125 @@
1
+ #include "./config.h"
2
+ #include <bits/stdc++.h>
3
+ using namespace std;
4
+
5
+ #ifndef NO_RUBY_EXT
6
+ #include <rice/rice.hpp>
7
+ #include <rice/stl.hpp>
8
+ using namespace Rice;
9
+ #endif
10
+
11
+ template <class T>
12
+ struct Edge {
13
+ int rev, from, to; // rev:逆向きの辺の番号
14
+ T cap, original_cap;
15
+ Edge(int r, int f, int t, T c) : rev(r), from(f), to(t), cap(c), original_cap(c) {}
16
+ };
17
+
18
+ template <class T>
19
+ struct Graph {
20
+ vector<vector<Edge<T>>> G;
21
+ Graph(int n = 0) : G(n) {}
22
+ vector<Edge<T>>& operator[](int i) { return G[i]; }
23
+ const size_t size() const { return G.size(); }
24
+ Edge<T>& redge(Edge<T> e) { // 逆向きの辺を返す
25
+ return G[e.to][e.rev]; // 自己ループはないと仮定(あれば G[e.to][e.rev + 1] とする必要がある)
26
+ }
27
+ void add_edge(int from, int to, T cap) { // 有向辺を加える
28
+ G[from].push_back(Edge<T>((int)G[to].size(), from, to, cap));
29
+ G[to].push_back(Edge<T>((int)G[from].size() - 1, to, from, 0));
30
+ }
31
+ };
32
+
33
+ /* FordFulkerson: Ford-Fulkersonのアルゴリズムで最大流を求める構造体
34
+ max_flow(G,s,t) :グラフGの最大流が求まる
35
+ 副作用:G は最大流の残余ネットワークになる
36
+ 計算量: O(|f*||E|) (f*:最大流)
37
+ */
38
+ template <class T>
39
+ struct FordFulkerson {
40
+ const T INF = 1e9;
41
+ vector<int> used;
42
+ vector<int> last_used;
43
+
44
+ FordFulkerson(){};
45
+ T dfs(Graph<T>& G, int v, int t, T f) { // 増加可能経路を見つけて増加分のフローを返す
46
+ if (v == t) return f;
47
+ used[v] = 1;
48
+ for (auto& e : G[v]) {
49
+ if (used[e.to] == 0 && e.cap > 0) {
50
+ T d = dfs(G, e.to, t, min(f, e.cap));
51
+ if (d > 0) {
52
+ e.cap -= d;
53
+ G.redge(e).cap += d;
54
+ return d;
55
+ }
56
+ }
57
+ }
58
+ return 0;
59
+ }
60
+ T max_flow(Graph<T>& G, int s, int t) {
61
+ T flow = 0;
62
+ while (true) {
63
+ last_used.clear();
64
+ for (int i = 0; i < used.size(); i++) {
65
+ last_used.push_back(used[i]);
66
+ }
67
+ used.assign(G.size(), 0);
68
+ T f = dfs(G, s, t, INF); // f が増加分のフロー
69
+ if (f == 0) {
70
+ return flow;
71
+ } else {
72
+ flow += f;
73
+ }
74
+ }
75
+ return 0;
76
+ }
77
+ };
78
+
79
+ #ifdef NO_RUBY_EXT
80
+ int main() {
81
+ int X, Y, E;
82
+ cin >> X >> Y >> E;
83
+ Graph<int> G(X + Y + 2);
84
+ for (int i = 0; i < X; i++) { // ソース(0)から X(1~X) への辺
85
+ G.add_edge(0, i + 1, 1);
86
+ }
87
+ for (int i = 0; i < E; i++) { // X(1~X) から Y(X+1~X+Y) への辺
88
+ int x, y;
89
+ cin >> x >> y;
90
+ G.add_edge(x + 1, y + X + 1, 1);
91
+ }
92
+ for (int i = 0; i < Y; i++) { // Y(X+1~X+Y) からシンク(X+Y+1)への辺
93
+ G.add_edge(i + X + 1, X + Y + 1, 1);
94
+ }
95
+
96
+ FordFulkerson<int> ff;
97
+ cout << ff.max_flow(G, 0, X + Y + 1) << endl;
98
+ }
99
+ #else
100
+
101
+ extern "C" {
102
+
103
+ void Init_ford_fulkerson() {
104
+
105
+ Data_Type<Edge<int>> rb_cEdge =
106
+ define_class<Edge<int>>("Edge")
107
+ .define_attr("rev", &Edge<int>::rev, Rice::AttrAccess::Read)
108
+ .define_attr("from", &Edge<int>::from, Rice::AttrAccess::Read)
109
+ .define_attr("to", &Edge<int>::to, Rice::AttrAccess::Read)
110
+ .define_attr("cap", &Edge<int>::cap, Rice::AttrAccess::Read);
111
+
112
+ Data_Type<Graph<int>> rb_cGraph =
113
+ define_class<Graph<int>>("Graph")
114
+ .define_constructor(Constructor<Graph<int>, int>(), (Arg("n")))
115
+ .define_attr("G", &Graph<int>::G, Rice::AttrAccess::Read)
116
+ .define_method("add_edge", &Graph<int>::add_edge);
117
+
118
+ Data_Type<FordFulkerson<int>> rb_cFordFulkerson =
119
+ define_class<FordFulkerson<int>>("FordFulkerson")
120
+ .define_constructor(Constructor<FordFulkerson<int>>())
121
+ .define_method("max_flow", &FordFulkerson<int>::max_flow)
122
+ .define_attr("used", &FordFulkerson<int>::last_used, Rice::AttrAccess::Read);
123
+ };
124
+ }
125
+ #endif
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manasimu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.36
4
+ version: 0.0.38
5
5
  platform: ruby
6
6
  authors:
7
7
  - so1itaryrove
@@ -18,7 +18,9 @@ extensions:
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - db/card_type_aggregate
21
+ - ext/manasimu/config.h
21
22
  - ext/manasimu/extconf.rb
23
+ - ext/manasimu/ford_fulkerson.cpp
22
24
  - lib/manasimu.rb
23
25
  - lib/manasimu/api_util.rb
24
26
  - lib/manasimu/card.rb