// Copyright (C) 2004-2008 The Trustees of Indiana University. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // Authors: Douglas Gregor // Andrew Lumsdaine // Example usage of breadth_first_search algorithm // Enable PBGL interfaces to BGL algorithms #include // Communicate via MPI #include // Breadth-first search algorithm #include // Distributed adjacency list #include // METIS Input #include // Graphviz Output #include // For choose_min_reducer #include // Standard Library includes #include #include #ifdef BOOST_NO_EXCEPTIONS void boost::throw_exception(std::exception const& ex) { std::cout << ex.what() << std::endl; abort(); } #endif using namespace boost; using boost::graph::distributed::mpi_process_group; /* An undirected graph with distance values stored on the vertices. */ typedef adjacency_list, undirectedS, /*Vertex properties=*/property > Graph; int main(int argc, char* argv[]) { boost::mpi::environment env(argc,argv); // Parse command-line options const char* filename = "weighted_graph.gr"; if (argc > 1) filename = argv[1]; // Open the METIS input file std::ifstream in(filename); graph::metis_reader reader(in); // Load the graph using the default distribution Graph g(reader.begin(), reader.end(), reader.num_vertices()); // Get vertex 0 in the graph graph_traits::vertex_descriptor start = vertex(0, g); // Compute BFS levels from vertex 0 property_map::type distance = get(vertex_distance, g); // Initialize distances to infinity and set reduction operation to 'min' BGL_FORALL_VERTICES(v, g, Graph) { put(distance, v, (std::numeric_limits::max)()); } distance.set_reduce(boost::graph::distributed::choose_min_reducer()); put(distance, start, 0); breadth_first_search (g, start, visitor(make_bfs_visitor(record_distances(distance, on_tree_edge())))); // Output a Graphviz DOT file std::string outfile; if (argc > 2) outfile = argv[2]; else { outfile = filename; size_t i = outfile.rfind('.'); if (i != std::string::npos) outfile.erase(outfile.begin() + i, outfile.end()); outfile += "-bfs.dot"; } if (process_id(process_group(g)) == 0) { std::cout << "Writing GraphViz output to " << outfile << "... "; std::cout.flush(); } write_graphviz(outfile, g, make_label_writer(distance)); if (process_id(process_group(g)) == 0) std::cout << "Done." << std::endl; return 0; }