37template<
typename InCluster,
typename Neighbors>
39 InCluster&& in_cluster,
40 Neighbors&& neighbors) {
42 res.
id.resize(n_sites);
43 res.
sizes.reserve(64);
45 for (
int i = 0; i < n_sites; ++i)
46 res.
id[i] = in_cluster(i) ? -1 : -2;
48 std::vector<int> queue(n_sites);
49 int qhead = 0, qtail = 0;
51 for (
int start = 0; start < n_sites; ++start) {
52 if (res.
id[start] != -1)
55 const int cid =
static_cast<int>(res.
sizes.size());
56 res.
sizes.push_back(0);
58 queue[qtail++] = start;
60 while (qhead < qtail) {
61 const int i = queue[qhead++];
63 neighbors(i, [&](
int nb) {
64 if (res.
id[nb] == -1) {
ClusterResult connected_components(int n_sites, InCluster &&in_cluster, Neighbors &&neighbors)
int largest_id
Index of largest cluster (-1 if none)
std::vector< int > id
Per-site label: -2 excluded, >=0 cluster index.
int largest_size
Size of largest cluster.
std::vector< int > sizes
sizes[c] = number of sites in cluster c