manasimu 0.0.36 → 0.0.38

Sign up to get free protection for your applications and to get access to all the features.
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