| 260 | //} |
| 261 | |
| 262 | VectorI SymmetryOperators::label_connected_components(size_t num_entries, |
| 263 | const SymmetryOperators::SymmetryConnectivity& connectivity) { |
| 264 | size_t count = 0; |
| 265 | VectorI components = VectorI::Ones(num_entries) * -1; |
| 266 | for (size_t i=0; i<num_entries; i++) { |
| 267 | if (components[i] >= 0) continue; |
| 268 | |
| 269 | std::queue<size_t> Q; |
| 270 | Q.push(i); |
| 271 | components[i] = count; |
| 272 | |
| 273 | while (!Q.empty()) { |
| 274 | size_t curr = Q.front(); |
| 275 | Q.pop(); |
| 276 | for (auto neighbor : connectivity[curr]) { |
| 277 | if (components[neighbor] == -1) { |
| 278 | Q.push(neighbor); |
| 279 | components[neighbor] = count; |
| 280 | } |
| 281 | } |
| 282 | } |
| 283 | count++; |
| 284 | } |
| 285 | return components; |
| 286 | } |
| 287 | |