Boost logo

Boost Users :

From: Shaw, Richard A (richard.shaw_at_[hidden])
Date: 2002-08-22 03:19:35


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.


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