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)
50 std::vector<int> queue(n_sites);
51 int qhead = 0, qtail = 0;
53 for (
int start = 0; start < n_sites; ++start) {
54 if (res.
id[start] != -1)
57 const int cid =
static_cast<int>(res.
sizes.size());
58 res.
sizes.push_back(0);
60 queue[qtail++] = start;
62 while (qhead < qtail) {
63 const int i = queue[qhead++];
65 neighbors(i, [&](
int nb) {
66 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