
Hello,
I'm using Boost.Graph version 1.53.0. I'm trying to write some graph
algorithms and I want to minimize the requirements of the input graph.
I have a question about Boost.Graph concepts. I wrote a very simple
code as follows:
typedef boost::adjacency_list<
boost::vecS,
boost::vecS,
boost::bidirectionalS> G;
int main() {
G g;
boost::add_edge(0, 1, g);
auto res = boost::edge(0, 1, g); // Why can I call it?
std::cout << std::boolalpha << res.second << std::endl;
boost::graph_traits<G>::edge_descriptor e = res.first;
std::cout << boost::source(e, g) << "," << boost::target(e, g) << std::endl;
}
It works, but I don't understand why I can call boost::edge().
According to the following document, AdjacencyMatrix concept provides
Direct Edge Access functionality, so I can call edge(u,v,g) :
http://www.boost.org/doc/libs/1_53_0/libs/graph/doc/AdjacencyMatrix.html
The class template adjacency_list is a model of
VertexAndEdgeListGraph, MutablePropertyGraph, CopyConstructible,
Assignable, and Serializable.
http://www.boost.org/doc/libs/1_53_0/libs/graph/doc/adjacency_list.html
So, adjacency_list is not satisfied AdjacencyMatrix concept.
I checked which function template is called, then I found the
following function is called:
boost/graph/detail/adjacency_list.hpp:1582
template