@@ -34,7 +34,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
34
34
#include < boost/graph/strong_components.hpp>
35
35
36
36
#include < vector>
37
- #include < map>
38
37
#include < utility>
39
38
#include < algorithm>
40
39
@@ -57,75 +56,42 @@ class Pgr_components {
57
56
typedef typename G::V V;
58
57
59
58
// ! Connected Components Vertex Version
60
- std::vector<pgr_componentV_t > connectedComponentsV (
59
+ std::vector<pgr_componentsV_rt > connectedComponentsV (
61
60
G &graph);
62
61
63
62
// ! Strongly Connected Components Vertex Version
64
- std::vector<pgr_componentV_t > strongComponentsV (
63
+ std::vector<pgr_componentsV_rt > strongComponentsV (
65
64
G &graph);
66
65
67
66
private:
68
- // ! Compare two pgr_componentV_t structs
69
- static bool sort_cmp (
70
- const pgr_componentV_t &a,
71
- const pgr_componentV_t &b);
72
-
73
67
// ! Generate Results, Vertex Version
74
- std::vector<pgr_componentV_t > generate_resultsV (
68
+ std::vector<pgr_componentsV_rt > generate_resultsV (
75
69
G &graph,
76
70
std::vector< V >);
77
71
78
- // ! Generate Map V_to_id
79
- std::map< V, int64_t > V_to_id;
80
- void generate_map (
81
- std::map< int64_t , V > id_to_V);
82
72
};
83
73
84
74
85
75
/* ******************* IMPLEMENTTION ******************/
86
76
87
- // ! Compare two pgr_componentV_t structs
88
- template < class G >
89
- bool
90
- Pgr_components< G >::sort_cmp(
91
- const pgr_componentV_t &a,
92
- const pgr_componentV_t &b) {
93
- if (a.component == b.component )
94
- return a.node < b.node ;
95
- return a.component < b.component ;
96
- }
97
-
98
- // ! Generate map V_to_id
99
- template < class G >
100
- void
101
- Pgr_components< G >::generate_map(
102
- std::map< int64_t , V > id_to_V) {
103
- V_to_id.clear ();
104
- for (auto iter : id_to_V) {
105
- V_to_id.insert (std::make_pair (iter.second , iter.first ));
106
- }
107
- }
108
-
109
77
// ! Generate Results, Vertex Version
110
78
template < class G >
111
- std::vector<pgr_componentV_t >
79
+ std::vector<pgr_componentsV_rt >
112
80
Pgr_components< G >::generate_resultsV(
113
81
G &graph,
114
82
std::vector< V > components) {
115
- // generate V_to_id
116
- generate_map (graph.vertices_map );
117
83
118
84
// generate results
119
85
auto totalNodes = num_vertices (graph.graph );
120
86
121
- std::vector< pgr_componentV_t > results;
87
+ std::vector< pgr_componentsV_rt > results;
122
88
results.resize (totalNodes);
123
89
124
90
std::vector< int64_t > result_comp;
125
91
result_comp.resize (0 );
126
92
size_t temp_size = 0 ;
127
- for (auto i = 0 ; i < totalNodes; i++) {
128
- results[i].node = V_to_id. find (i)-> second ;
93
+ for (V i = 0 ; i < totalNodes; i++) {
94
+ results[i].node = graph[i]. id ;
129
95
if (components[i] >= temp_size) {
130
96
result_comp.push_back (results[i].node );
131
97
temp_size++;
@@ -136,51 +102,54 @@ Pgr_components< G >::generate_resultsV(
136
102
}
137
103
138
104
// generate component number
139
- for (auto i = 0 ; i < totalNodes; i++) {
105
+ for (V i = 0 ; i < totalNodes; i++) {
140
106
results[i].component = result_comp[components[i]];
141
107
}
142
108
143
109
// sort results and generate n_seq
144
- std::sort (results.begin (), results.end (), sort_cmp);
145
- for (auto i = 0 ; i < totalNodes; i++) {
146
- if (i == 0 || results[i].component != results[i - 1 ].component ) {
147
- results[i].n_seq = 1 ;
148
- } else {
149
- results[i].n_seq = results[i - 1 ].n_seq + 1 ;
150
- }
151
- }
110
+ std::sort (results.begin (), results.end (),
111
+ [](const pgr_componentsV_rt &left, const pgr_componentsV_rt &right) {
112
+ return left.node < right.node ; });
113
+
114
+ std::stable_sort (results.begin (), results.end (),
115
+ [](const pgr_componentsV_rt &left, const pgr_componentsV_rt &right) {
116
+ return left.component < right.component ; });
117
+
118
+ auto current = results[0 ].component ;
119
+ int seq (0 );
120
+ for (auto &result: results) {
121
+ result.n_seq = result.component == current ? ++seq : seq = 1 ;
122
+ current = result.component ;
123
+ }
124
+
152
125
return results;
153
126
}
154
127
155
128
// ! Connected Components Vertex Version
156
129
template < class G >
157
- std::vector<pgr_componentV_t >
130
+ std::vector<pgr_componentsV_rt >
158
131
Pgr_components< G >::connectedComponentsV(
159
132
G &graph) {
160
133
// perform the algorithm
161
134
std::vector< V > components (num_vertices (graph.graph ));
162
135
boost::connected_components (graph.graph , &components[0 ]);
163
136
164
137
// get the results
165
- std::vector<pgr_componentV_t> results = generate_resultsV (graph, components);
166
-
167
- // get the results
168
- return results;
138
+ return generate_resultsV (graph, components);
169
139
}
170
140
171
141
// ! Strongly Connected Components Vertex Version
172
142
template < class G >
173
- std::vector<pgr_componentV_t >
143
+ std::vector<pgr_componentsV_rt >
174
144
Pgr_components< G >::strongComponentsV(
175
145
G &graph) {
176
146
// perform the algorithm
177
147
std::vector< V > components (num_vertices (graph.graph ));
178
- boost::strong_components (graph.graph , &components[0 ]);
148
+ boost::strong_components (graph.graph ,
149
+ boost::make_iterator_property_map (components.begin (), get (boost::vertex_index, graph.graph )));
179
150
180
151
// get the results
181
- std::vector<pgr_componentV_t> results = generate_resultsV (graph, components);
182
-
183
- return results;
152
+ return generate_resultsV (graph, components);
184
153
}
185
154
186
155
#endif // INCLUDE_COMPONENTS_PGR_COMPONENTS_HPP_
0 commit comments