manasimu 0.0.37 → 0.0.39

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: dfddb9b67b9eac0b7ee4543b20a8538843f46838354f821dbb0993f94edff721
4
- data.tar.gz: be26dd437beefa519f043954c2eddde291d0bc32e3e7afaffa7414f68748fef7
3
+ metadata.gz: 9fe16394f29a9190d502c063076bc1a08d9da2880409d4572472347f1f79a1b0
4
+ data.tar.gz: 4eae481a2d2e126e524c09b0dd4d5792a5457e7975a60497a46cdae0b71bcff5
5
5
  SHA512:
6
- metadata.gz: 0a1217c58b600a709669d9609e13cef431c392043aaba9f7a154e8f350cf9e8dc454e4e5db9eaced373673749996f53fe3711e71c4c51f2abdc7f4c5c4574516
7
- data.tar.gz: 3da2ba53f07926d11656008d2a131de9cdb9ba639cbfc5f3bef29399066f8ff612c2ac53c3ce0a86a178da553cc2937964fa82e646e18e435ed65a555e006fab
6
+ metadata.gz: d36c4c95f78a000af39fb4148ec907c93452edbc8485fa6eb6e11850d6399b6a0cd5260fda29f0627d58120e7061fcaa6e75230faeaa394b67aa7f640602a8ec
7
+ data.tar.gz: 6ac1e7f68d71f26df69088afc0659fa5f712b528b2ad0d99925159bf7a46c13048c69a587e3a01799bea7f7ca9a3d12d8890b9f2863760d5e0ff36035a4d7b54
Binary file
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
data/lib/manasimu/data.rb CHANGED
@@ -274,6 +274,7 @@ class Deck
274
274
  clone_card_types = []
275
275
  deck_items.each do |deck_item|
276
276
  card_type = card_types.find(deck_item[:set], deck_item[:setnum])
277
+ next if not card_type
277
278
  clone = CardType.create(card_type, deck_item[:name])
278
279
  clone_card_types << clone
279
280
  if clone.is_land?
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.37
4
+ version: 0.0.39
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