
Can anybody tell my why the find_edge function in the code below fails to get a property if I return the first edge in the list. This is what happens - Find_edge looks for edge A - B It winds it and prints out the edge descriptor, and the weight of the edge It the returns the edge The main code prints out the edge descriptor and the fails when trying to print the weight. BTW - Is there a ready made function to find an edge based on the vertices ? #include <boost/config.hpp> #include <iostream> #include <fstream> #include <boost/graph/graph_traits.hpp> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/dijkstra_shortest_paths.hpp> using namespace boost; // Find edge template <class Graph> std::pair<bool, graph_traits<Graph>::edge_descriptor> find_edge(graph_traits<Graph>::vertex_descriptor u, graph_traits<Graph>::vertex_descriptor v, Graph g) { graph_traits<Graph>::out_edge_iterator ei, edge_end; for (boost::tie(ei,edge_end) = out_edges(u, g); ei != edge_end; ++ei) { if (target(*ei, g) == v) { std::cout << "Inside " << *ei << " " << get(edge_weight, g, *ei) << std::endl; return std::make_pair(true, *ei); } } return std::make_pair(false, *ei); // Is there a null edge that I can return ? } int main(int, char *[]) { typedef adjacency_list < listS, vecS, directedS, no_property, property < edge_weight_t, int > > graph_t; typedef graph_traits < graph_t >::vertex_descriptor vertex_descriptor; typedef graph_traits < graph_t >::edge_descriptor edge_descriptor; typedef std::pair<int, int> Edge; const int num_nodes = 5; enum nodes { A, B, C, D, E }; Edge edge_array[] = { Edge(A, C), Edge(B, B), Edge(B, D), Edge(B, E), Edge(C, B), Edge(C, D), Edge(D, E), Edge(E, A), Edge(E, B) }; int weights[] = { 1, 2, 1, 2, 7, 3, 1, 1, 1 }; int num_arcs = sizeof(edge_array) / sizeof(Edge); #ifdef BOOST_MSVC graph_t g(num_nodes); property_map<graph_t, edge_weight_t>::type weightmap = get(edge_weight, g); for (std::size_t j = 0; j < num_arcs; ++j) { edge_descriptor e; bool inserted; tie(e, inserted) = add_edge(edge_array[j].first, edge_array[j].second, g); weightmap[e] = weights[j]; } #else graph_t g(edge_array, edge_array + num_arcs, weights, num_nodes); property_map<graph_t, edge_weight_t>::type weightmap = get(edge_weight, g); #endif graph_traits < graph_t >::edge_descriptor e; bool found; std::cout << "List All" << std::endl; graph_traits < graph_t >::edge_iterator ei, ei_end; for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) { std::cout << *ei << get(weightmap, *ei) << std::endl; } std::cout << "List Not First" << std::endl; tie(found, e) = find_edge< graph_t >(E, A, g); std::cout << "Outside " << e << get(weightmap, e) << std::endl; // This edge is OK std::cout << "List First" << std::endl; tie(found, e) = find_edge< graph_t >(A, C, g); std::cout << "Outside " << e << get(weightmap, e) << std::endl; // This line fails to get the weight return EXIT_SUCCESS; } Richard Shaw ¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø¤º°`°º¤ø,¸¸,ø¤ Atkins Transport Systems Woodcote Grove Ashley Road Epsom KT18 5BW Direct Dial.: +44 (0) 1372 756407 Switchboard: +44 (0) 1372 726140 Fax: +44 (0) 1372 740055 www.atkinsglobal.com/transportsystems <www.atkinsglobal.com/transportsystems> This email and any attached files are confidential and copyright protected. If you are not the addressee, any dissemination of this communication is strictly prohibited. Unless otherwise expressly agreed in writing, nothing stated in this communication shall be legally binding.