This documentation is being rewritten. If something looks off, please cross-check with the Boost 1.91.0 Boost.Graph docs and open an issue.

Random Graph Utilities

Defined in: <boost/graph/random.hpp>

Routines to create random graphs, select random vertices and edges, and randomize properties.

Example

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/random.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <iostream>

using namespace boost;
using Graph = adjacency_list<vecS, vecS, directedS,
    no_property, property<edge_weight_t, double>>;

int main() {
    Graph g;
    mt19937 gen(42);

    bool allow_parallel = true;
    bool allow_self_loops = false;
    generate_random_graph(g, 5, 8, gen, allow_parallel, allow_self_loops);
    std::cout << num_vertices(g) << " vertices, " << num_edges(g) << " edges\n";

    // Assign random weights to all edges
    randomize_property<edge_weight_t>(g, gen);

    std::cout << "random vertex: " << random_vertex(g, gen) << "\n";

    auto e = random_edge(g, gen);
    std::cout << "random edge: " << source(e, g) << " -> " << target(e, g) << "\n";

    if (out_degree(vertex(0, g), g) > 0) {
        auto oe = random_out_edge(g, vertex(0, g), gen);
        std::cout << "random out-edge of 0: "
                  << source(oe, g) << " -> " << target(oe, g) << "\n";

        auto we = weighted_random_out_edge(g, vertex(0, g), get(edge_weight, g), gen);
        std::cout << "weighted random out-edge of 0: "
                  << source(we, g) << " -> " << target(we, g) << "\n";
    }
}
5 vertices, 8 edges
random vertex: 1
random edge: 0 -> 2
random out-edge of 0: 0 -> 2
weighted random out-edge of 0: 0 -> 2

generate_random_graph

template <typename MutableGraph, typename RandNumGen>
void generate_random_graph(MutableGraph& g, vertices_size_type V, vertices_size_type E, RandNumGen& gen, bool allow_parallel = true, bool self_edges = false);

Adds V vertices and E random edges to g. If allow_parallel is false, duplicate edges are rejected. If self_edges is false, no edge will connect a vertex to itself.

Precondition: num_vertices(g) == 0
Complexity: O(V * E)


Overload that outputs created vertices and edges through iterators:

template <typename MutableGraph, typename RandNumGen, typename VertexOutputIterator, typename EdgeOutputIterator>
void generate_random_graph(MutableGraph& g, vertices_size_type V, vertices_size_type E, RandNumGen& gen, VertexOutputIterator vertex_out, EdgeOutputIterator edge_out, bool self_edges = false);

random_vertex

template <typename Graph, typename RandomNumGen>
vertex_descriptor random_vertex(Graph& g, RandomNumGen& gen);

Returns a uniformly random vertex from g.

Precondition: num_vertices(g) > 0
Complexity: O(num_vertices(g))

random_edge

template <typename Graph, typename RandomNumGen>
edge_descriptor random_edge(Graph& g, RandomNumGen& gen);

Returns a uniformly random edge from g.

Precondition: num_edges(g) > 0
Complexity: O(num_edges(g))

random_out_edge

template <typename Graph, typename RandomNumGen>
edge_descriptor random_out_edge(Graph& g, vertex_descriptor src, RandomNumGen& gen);

Returns a uniformly random out-edge of vertex src.

Precondition: out_degree(src, g) > 0
Complexity: O(out_degree(src, g))

weighted_random_out_edge

template <typename Graph, typename WeightMap, typename RandomNumGen>
edge_descriptor weighted_random_out_edge(Graph& g, vertex_descriptor src, WeightMap weight, RandomNumGen& gen);

Returns a random out-edge of vertex src, where each edge is selected with probability proportional to its weight. WeightMap must be a Readable Property Map with key type edge_descriptor.

Precondition: out_degree(src, g) > 0 and total weight > 0
Complexity: O(out_degree(src, g))

randomize_property

template <typename Property, typename G, typename RandomGenerator>
void randomize_property(G& g, RandomGenerator& rg);

Assigns a random value to Property on every vertex or every edge, depending on whether Property has vertex_property_tag or edge_property_tag kind.

Complexity: O(V) or O(E) depending on property kind.