diff --git a/src/random_networks/barabasi_albert.tpp b/src/random_networks/barabasi_albert.tpp index 06452a9..6af562a 100644 --- a/src/random_networks/barabasi_albert.tpp +++ b/src/random_networks/barabasi_albert.tpp @@ -1,3 +1,4 @@ +#include #include #include "../../include/reticula/network_concepts.hpp" @@ -18,29 +19,30 @@ namespace reticula { std::vector> edges; edges.reserve(static_cast(m*(n-m))); - std::vector degrees(static_cast(n)); + std::vector repeated_nodes; + repeated_nodes.reserve(static_cast(2 * m * (n - m))); + for (VertT i = 0; i < m; i++) { edges.emplace_back(i, m); - degrees[static_cast(i)] += 1; - degrees[static_cast(m)] += 1; + repeated_nodes.push_back(i); + repeated_nodes.push_back(m); } for (VertT current_node = m+1; current_node < n; current_node++) { - std::discrete_distribution dist( - degrees.begin(), - degrees.begin() + static_cast(current_node)); + std::uniform_int_distribution dist( + 0, repeated_nodes.size()-1); std::unordered_set targets; targets.reserve(static_cast(m)); while (targets.size() < static_cast(m)) - targets.insert(dist(generator)); + targets.insert(repeated_nodes[dist(generator)]); for (const auto& i: targets) { edges.emplace_back(current_node, i); - degrees[static_cast(i)] += 1; - degrees[static_cast(current_node)] += 1; + repeated_nodes.push_back(i); + repeated_nodes.push_back(current_node); } }