// Copyright (C) 2004-2006 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 dijkstra_shortest_paths algorithm // Enable PBGL interfaces to BGL algorithms #include // Communication via MPI #include // Dijkstra's single-source shortest paths algorithm #include // Distributed adjacency list #include // METIS Input #include // Graphviz Output #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, weighted graph with distance values stored on the vertices. */ typedef adjacency_list_traits, undirectedS>::vertex_descriptor vertex_descriptor; typedef adjacency_list, undirectedS, /*Vertex properties=*/property >, /*Edge 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.weight_begin(), reader.num_vertices()); // Get vertex 0 in the graph graph_traits::vertex_descriptor start = vertex(0, g); // Compute shortest paths from vertex 0 dijkstra_shortest_paths(g, start, distance_map(get(vertex_distance, g)).predecessor_map(get(vertex_predecessor, g))); // Output a Graphviz DOT file std::string outfile = filename; if (argc > 2) outfile = argv[2]; else { size_t i = outfile.rfind('.'); if (i != std::string::npos) outfile.erase(outfile.begin() + i, outfile.end()); outfile += "-dijkstra.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(get(vertex_distance, g)), make_label_writer(get(edge_weight, g))); if (process_id(process_group(g)) == 0) std::cout << "Done." << std::endl; return 0; }