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