20 std::vector<std::vector<int>>
find_blocks(nda::matrix_view<double> m,
double threshold) {
22 std::vector<bool> visited(n,
false);
23 std::vector<std::vector<int>> components;
26 std::vector<std::vector<int>> adjacency_list(n);
27 for (
int i = 0; i < n; ++i)
28 for (
int j = 0; j < n; ++j)
29 if (abs(m(i, j)) > threshold) adjacency_list[i].push_back(j);
31 auto bfs = [&](
int node) {
32 std::deque<int> queue = {node};
33 std::vector<int> component;
34 while (!queue.empty()) {
35 int curr = queue.front();
39 component.push_back(curr);
40 for (
int neighbor : adjacency_list[curr]) {
41 if (!visited[neighbor]) queue.push_back(neighbor);
48 for (
int i = 0; i < n; ++i)
49 if (!visited[i]) components.push_back(bfs(i));
52 for (
auto &c : components) std::ranges::sort(c);