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 +4 -4
- data/ext/manasimu/config.h +0 -0
- data/ext/manasimu/ford_fulkerson.cpp +125 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6ae84013078ea01136343e8a484fdd74e91b52030dbde9d6fd15fe1af8f511b
|
4
|
+
data.tar.gz: 4ca268428f78118faa37f018cd993870eb679f2ffffd269137fe256edb021096
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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
|