Boost logo

Boost Users :

Subject: [Boost-users] graph all pair shortest path problem
From: Nicolas Heine (nheine_at_[hidden])
Date: 2008-09-05 10:07:55


Hi *,

I have a question about the All Pair Shortest Path (Johnson) algorithm.

Here is my code:

#include <boost/config.hpp>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <vector>
#include <boost/property_map.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/johnson_all_pairs_shortest.hpp>

int main() {
        using namespace boost;

        typedef property<vertex_index_t, int, property<vertex_name_t,
std::string> >
                        VertexProperty;

        typedef property<edge_weight_t, int, property<edge_weight2_t, int> >
                                EdgeProperty;

        typedef property<graph_name_t, std::string> GraphProperty;
        //adjacency_list<OutEdgeList, VertexList, Directed,
        // VertexProperties, EdgeProperties,
        // GraphProperties, EdgeList>
        typedef adjacency_list<listS, listS, undirectedS, VertexProperty,
                        EdgeProperty, GraphProperty> Graph;

        boost::graph_traits<Graph>::vertex_descriptor u, v, w, first, second;

        int N = 10;
        Graph g;

        first = add_vertex(g);
        put(vertex_index, g, first, num_vertices(g));

        second = add_vertex(g);
        put(vertex_index, g, second, num_vertices(g));

        add_edge(first, second, g);

        u = first;
        v = second;
        for (int i = 2; i < N; i++) {
                w = add_vertex(g);
                put(vertex_index, g, w, i + 1);
                add_edge(u, w, g);
                add_edge(v, w, g);
                u = v;
                v = w;
        }
        add_edge(u, first, g);
        add_edge(v, second, g), add_edge(v, first, g);
        std::cout << "Finished to build Graph" << std::endl;

        //set weights to 1
        typedef graph_traits<Graph>::edge_iterator EdgeIterator;
        EdgeIterator ei, edge_end;
        for ( boost::tie(ei, edge_end) = edges(g); ei != edge_end; ++ei){
                put(edge_weight, g, *ei, 1);
        }

        std::vector<int> d(N, (std::numeric_limits<int>::max)());
        int D[N][N];
        johnson_all_pairs_shortest_paths(g, D, distance_map(&d[0]));

        std::cout << " ";
        for (int k = 0; k < N; ++k)
                std::cout << std::setw(5) << k;
        std::cout << std::endl;
        for (int i = 0; i < N; ++i) {
                std::cout << i << " -> ";
                for (int j = 0; j < N; ++j) {
                        if (D[i][j] > 20 || D[i][j] < -20)
                                std::cout << std::setw(5) << "inf";
                        else
                                std::cout << std::setw(5) << D[i][j];
                }
                std::cout << std::endl;
        }

        return 0;
}

When I compile I get the error:
../src/BGLTest.cpp: In function 'int main()':
../src/BGLTest.cpp:73: error: no matching function for call to
'johnson_all_pairs_shortest_paths(main()::Graph&, int [(((long
unsigned int)(((int)N) - 1)) + 1u)][(((long unsigned int)(((int)N) -
1)) + 1u)], boost::bgl_named_params<int*, boost::vertex_distance_t,
boost::no_property>)'

What does that mean? I want to use the Johnson algorithm with a listS
= Vertexlist and listS = Egelist. With listS, vecS as in your
example it works fine. What can I do?

Thanks in advance,
Nico


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net