# HG changeset patch # User alpar # Date 1138958297 0 # Node ID 5db4ff8d69dec08f4030b7e49c5d32fda52080f0 # Parent 9e9c035a08be3c736cb0b2f99da554df5758224b Fight with Doxygen. Victory hasn't been reached yet, but it's on the horizon. diff -r 9e9c035a08be -r 5db4ff8d69de doc/graph-adaptors.dox --- a/doc/graph-adaptors.dox Fri Feb 03 09:03:05 2006 +0000 +++ b/doc/graph-adaptors.dox Fri Feb 03 09:18:17 2006 +0000 @@ -1,7 +1,7 @@ /** @defgroup graph_adaptors Adaptor Classes for Graphs + @ingroup graphs \brief This group contains several adaptor classes for graphs - @ingroup graphs The main parts of LEMON are the different graph structures, generic graph algorithms, graph concepts which couple these, and diff -r 9e9c035a08be -r 5db4ff8d69de lemon/graph_adaptor.h --- a/lemon/graph_adaptor.h Fri Feb 03 09:03:05 2006 +0000 +++ b/lemon/graph_adaptor.h Fri Feb 03 09:18:17 2006 +0000 @@ -38,29 +38,25 @@ namespace lemon { - // Graph adaptors - - /*! - \addtogroup graph_adaptors - @{ - */ - - /*! - Base type for the Graph Adaptors - - \warning Graph adaptors are in even more experimental state than the other - parts of the lib. Use them at you own risk. - - This is the base type for most of LEMON graph adaptors. - This class implements a trivial graph adaptor i.e. it only wraps the - functions and types of the graph. The purpose of this class is to - make easier implementing graph adaptors. E.g. if an adaptor is - considered which differs from the wrapped graph only in some of its - functions or types, then it can be derived from GraphAdaptor, and only the - differences should be implemented. - - \author Marton Makai - */ + //x\brief Base type for the Graph Adaptors + //x\ingroup graph_adaptors + //x + //xBase type for the Graph Adaptors + //x + //x\warning Graph adaptors are in even + //xmore experimental state than the other + //xparts of the lib. Use them at you own risk. + //x + //xThis is the base type for most of LEMON graph adaptors. + //xThis class implements a trivial graph adaptor i.e. it only wraps the + //xfunctions and types of the graph. The purpose of this class is to + //xmake easier implementing graph adaptors. E.g. if an adaptor is + //xconsidered which differs from the wrapped graph only in some of its + //xfunctions or types, then it can be derived from GraphAdaptor, + //xand only the + //xdifferences should be implemented. + //x + //xauthor Marton Makai template class GraphAdaptorBase { public: @@ -180,29 +176,23 @@ }; - /// A graph adaptor which reverses the orientation of the edges. - - ///\warning Graph adaptors are in even more experimental state than the other + ///\brief A graph adaptor which reverses the orientation of the edges. + ///\ingroup graph_adaptors + /// + ///\warning Graph adaptors are in even more experimental + ///state than the other ///parts of the lib. Use them at you own risk. /// - /// Let \f$G=(V, A)\f$ be a directed graph and - /// suppose that a graph instange \c g of type - /// \c ListGraph implements \f$G\f$. + /// If \c g is defined as ///\code /// ListGraph g; ///\endcode - /// For each directed edge - /// \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by - /// reversing its orientation. - /// Then RevGraphAdaptor implements the graph structure with node-set - /// \f$V\f$ and edge-set - /// \f$\{\bar e : e\in A \}\f$, i.e. the graph obtained from \f$G\f$ be - /// reversing the orientation of its edges. The following code shows how - /// such an instance can be constructed. + /// then ///\code /// RevGraphAdaptor gw(g); ///\endcode - ///\author Marton Makai + ///implements the graph obtained from \c g by + /// reversing the orientation of its edges. template class RevGraphAdaptor : @@ -290,30 +280,44 @@ || !(*node_filter_map)[Parent::target(i)])) Parent::nextOut(i); } - /// This function hides \c n in the graph, i.e. the iteration - /// jumps over it. This is done by simply setting the value of \c n - /// to be false in the corresponding node-map. + //x\e + + //x This function hides \c n in the graph, i.e. the iteration + //x jumps over it. This is done by simply setting the value of \c n + //x to be false in the corresponding node-map. void hide(const Node& n) const { node_filter_map->set(n, false); } - /// This function hides \c e in the graph, i.e. the iteration - /// jumps over it. This is done by simply setting the value of \c e - /// to be false in the corresponding edge-map. + //x\e + + //x This function hides \c e in the graph, i.e. the iteration + //x jumps over it. This is done by simply setting the value of \c e + //x to be false in the corresponding edge-map. void hide(const Edge& e) const { edge_filter_map->set(e, false); } - /// The value of \c n is set to be true in the node-map which stores - /// hide information. If \c n was hidden previuosly, then it is shown - /// again + //x\e + + //x The value of \c n is set to be true in the node-map which stores + //x hide information. If \c n was hidden previuosly, then it is shown + //x again void unHide(const Node& n) const { node_filter_map->set(n, true); } - /// The value of \c e is set to be true in the edge-map which stores - /// hide information. If \c e was hidden previuosly, then it is shown - /// again + //x\e + + //x The value of \c e is set to be true in the edge-map which stores + //x hide information. If \c e was hidden previuosly, then it is shown + //x again void unHide(const Edge& e) const { edge_filter_map->set(e, true); } - /// Returns true if \c n is hidden. + //x Returns true if \c n is hidden. + + //x\e + //x bool hidden(const Node& n) const { return !(*node_filter_map)[n]; } - /// Returns true if \c n is hidden. + //x Returns true if \c n is hidden. + + //x\e + //x bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; } typedef False NodeNumTag; @@ -382,94 +386,112 @@ while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextOut(i); } - /// This function hides \c n in the graph, i.e. the iteration - /// jumps over it. This is done by simply setting the value of \c n - /// to be false in the corresponding node-map. + //x\e + + //x This function hides \c n in the graph, i.e. the iteration + //x jumps over it. This is done by simply setting the value of \c n + //x to be false in the corresponding node-map. void hide(const Node& n) const { node_filter_map->set(n, false); } - /// This function hides \c e in the graph, i.e. the iteration - /// jumps over it. This is done by simply setting the value of \c e - /// to be false in the corresponding edge-map. + //x\e + + //x This function hides \c e in the graph, i.e. the iteration + //x jumps over it. This is done by simply setting the value of \c e + //x to be false in the corresponding edge-map. void hide(const Edge& e) const { edge_filter_map->set(e, false); } - /// The value of \c n is set to be true in the node-map which stores - /// hide information. If \c n was hidden previuosly, then it is shown - /// again + //x\e + + //x The value of \c n is set to be true in the node-map which stores + //x hide information. If \c n was hidden previuosly, then it is shown + //x again void unHide(const Node& n) const { node_filter_map->set(n, true); } - /// The value of \c e is set to be true in the edge-map which stores - /// hide information. If \c e was hidden previuosly, then it is shown - /// again + //x\e + + //x The value of \c e is set to be true in the edge-map which stores + //x hide information. If \c e was hidden previuosly, then it is shown + //x again void unHide(const Edge& e) const { edge_filter_map->set(e, true); } - /// Returns true if \c n is hidden. + //x Returns true if \c n is hidden. + + //x\e + //x bool hidden(const Node& n) const { return !(*node_filter_map)[n]; } - /// Returns true if \c n is hidden. + //x Returns true if \c n is hidden. + + //x\e + //x bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; } typedef False NodeNumTag; typedef False EdgeNumTag; }; - /*! \brief A graph adaptor for hiding nodes and edges from a graph. - - \warning Graph adaptors are in even more experimental state than the other - parts of the lib. Use them at you own risk. - - SubGraphAdaptor shows the graph with filtered node-set and - edge-set. If the \c checked parameter is true then it filters the edgeset - to do not get invalid edges without source or target. - Let \f$G=(V, A)\f$ be a directed graph - and suppose that the graph instance \c g of type ListGraph implements - \f$G\f$. - Let moreover \f$b_V\f$ and - \f$b_A\f$ be bool-valued functions resp. on the node-set and edge-set. - SubGraphAdaptor<...>::NodeIt iterates - on the node-set \f$\{v\in V : b_V(v)=true\}\f$ and - SubGraphAdaptor<...>::EdgeIt iterates - on the edge-set \f$\{e\in A : b_A(e)=true\}\f$. Similarly, - SubGraphAdaptor<...>::OutEdgeIt and SubGraphAdaptor<...>::InEdgeIt iterates - only on edges leaving and entering a specific node which have true value. + //x\brief A graph adaptor for hiding nodes and edges from a graph. + //x\ingroup graph_adaptors + //x + //x\warning Graph adaptors are in even more experimental + //xstate than the other + //xparts of the lib. Use them at you own risk. + //x + //xSubGraphAdaptor shows the graph with filtered node-set and + //xedge-set. If the \c checked parameter is true then it filters the edgeset + //xto do not get invalid edges without source or target. + //xLet \f$G=(V, A)\f$ be a directed graph + //xand suppose that the graph instance \c g of type ListGraph implements + //x\f$G\f$. + //x/Let moreover \f$b_V\f$ and + //x\f$b_A\f$ be bool-valued functions resp. on the node-set and edge-set. + //xSubGraphAdaptor<...>::NodeIt iterates + //xon the node-set \f$\{v\in V : b_V(v)=true\}\f$ and + //xSubGraphAdaptor<...>::EdgeIt iterates + //xon the edge-set \f$\{e\in A : b_A(e)=true\}\f$. Similarly, + //xSubGraphAdaptor<...>::OutEdgeIt and + //xSubGraphAdaptor<...>::InEdgeIt iterates + //xonly on edges leaving and entering a specific node which have true value. + //x + //xIf the \c checked template parameter is false then we have to note that + //xthe node-iterator cares only the filter on the node-set, and the + //xedge-iterator cares only the filter on the edge-set. + //xThis way the edge-map + //xshould filter all edges which's source or target is filtered by the + //xnode-filter. + //x\code + //xtypedef ListGraph Graph; + //xGraph g; + //xtypedef Graph::Node Node; + //xtypedef Graph::Edge Edge; + //xNode u=g.addNode(); //node of id 0 + //xNode v=g.addNode(); //node of id 1 + //xNode e=g.addEdge(u, v); //edge of id 0 + //xNode f=g.addEdge(v, u); //edge of id 1 + //xGraph::NodeMap nm(g, true); + //xnm.set(u, false); + //xGraph::EdgeMap em(g, true); + //xem.set(e, false); + //xtypedef SubGraphAdaptor, Graph::EdgeMap > SubGW; + //xSubGW gw(g, nm, em); + //xfor (SubGW::NodeIt n(gw); n!=INVALID; ++n) std::cout << g.id(n) << std::endl; + //xstd::cout << ":-)" << std::endl; + //xfor (SubGW::EdgeIt e(gw); e!=INVALID; ++e) std::cout << g.id(e) << std::endl; + //x\endcode + //xThe output of the above code is the following. + //x\code + //x1 + //x:-) + //x1 + //x\endcode + //xNote that \c n is of type \c SubGW::NodeIt, but it can be converted to + //x\c Graph::Node that is why \c g.id(n) can be applied. + //x + //xFor other examples see also the documentation of NodeSubGraphAdaptor and + //xEdgeSubGraphAdaptor. + //x + //x\author Marton Makai - If the \c checked template parameter is false then we have to note that - the node-iterator cares only the filter on the node-set, and the - edge-iterator cares only the filter on the edge-set. This way the edge-map - should filter all edges which's source or target is filtered by the - node-filter. - \code - typedef ListGraph Graph; - Graph g; - typedef Graph::Node Node; - typedef Graph::Edge Edge; - Node u=g.addNode(); //node of id 0 - Node v=g.addNode(); //node of id 1 - Node e=g.addEdge(u, v); //edge of id 0 - Node f=g.addEdge(v, u); //edge of id 1 - Graph::NodeMap nm(g, true); - nm.set(u, false); - Graph::EdgeMap em(g, true); - em.set(e, false); - typedef SubGraphAdaptor, Graph::EdgeMap > SubGW; - SubGW gw(g, nm, em); - for (SubGW::NodeIt n(gw); n!=INVALID; ++n) std::cout << g.id(n) << std::endl; - std::cout << ":-)" << std::endl; - for (SubGW::EdgeIt e(gw); e!=INVALID; ++e) std::cout << g.id(e) << std::endl; - \endcode - The output of the above code is the following. - \code - 1 - :-) - 1 - \endcode - Note that \c n is of type \c SubGW::NodeIt, but it can be converted to - \c Graph::Node that is why \c g.id(n) can be applied. - - For other examples see also the documentation of NodeSubGraphAdaptor and - EdgeSubGraphAdaptor. - - \author Marton Makai - */ template class SubGraphAdaptor : @@ -492,18 +514,20 @@ - /*! \brief An adaptor for hiding nodes from a graph. - - \warning Graph adaptors are in even more experimental state than the other - parts of the lib. Use them at you own risk. - - An adaptor for hiding nodes from a graph. - This adaptor specializes SubGraphAdaptor in the way that only the node-set - can be filtered. In usual case the checked parameter is true, we get the - induced subgraph. But if the checked parameter is false then we can only - filter only isolated nodes. - \author Marton Makai - */ + //x\brief An adaptor for hiding nodes from a graph. + //x\ingroup graph_adaptors + //x + //x\warning Graph adaptors are in even more experimental state + //xthan the other + //xparts of the lib. Use them at you own risk. + //x + //xAn adaptor for hiding nodes from a graph. + //xThis adaptor specializes SubGraphAdaptor in the way that only + //xthe node-set + //xcan be filtered. In usual case the checked parameter is true, we get the + //xinduced subgraph. But if the checked parameter is false then we can only + //xfilter only isolated nodes. + //x\author Marton Makai template class NodeSubGraphAdaptor : public SubGraphAdaptor n6 [ label="9, length:4" ]; - n4 -> n6 [ label="8, length:2" ]; - n3 -> n5 [ label="7, length:1" ]; - n2 -> n5 [ label="6, length:3" ]; - n2 -> n6 [ label="5, length:5" ]; - n2 -> n4 [ label="4, length:2" ]; - n1 -> n4 [ label="3, length:3" ]; - n0 -> n3 [ label="2, length:1" ]; - n0 -> n2 [ label="1, length:2" ]; - n0 -> n1 [ label="0, length:3" ]; - } - \enddot - - \code - Graph g; - Node s, t; - LengthMap length(g); - - readDimacs(std::cin, g, length, s, t); - - cout << "edges with lengths (of form id, source--length->target): " << endl; - for(EdgeIt e(g); e!=INVALID; ++e) - cout << g.id(e) << ", " << g.id(g.source(e)) << "--" - << length[e] << "->" << g.id(g.target(e)) << endl; - - cout << "s: " << g.id(s) << " t: " << g.id(t) << endl; - \endcode - Next, the potential function is computed with Dijkstra. - \code - typedef Dijkstra Dijkstra; - Dijkstra dijkstra(g, length); - dijkstra.run(s); - \endcode - Next, we consrtruct a map which filters the edge-set to the tight edges. - \code - typedef TightEdgeFilterMap - TightEdgeFilter; - TightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length); - - typedef EdgeSubGraphAdaptor SubGW; - SubGW gw(g, tight_edge_filter); - \endcode - Then, the maximum nimber of edge-disjoint \c s-\c t paths are computed - with a max flow algorithm Preflow. - \code - ConstMap const_1_map(1); - Graph::EdgeMap flow(g, 0); - - Preflow, Graph::EdgeMap > - preflow(gw, s, t, const_1_map, flow); - preflow.run(); - \endcode - Last, the output is: - \code - cout << "maximum number of edge-disjoint shortest path: " - << preflow.flowValue() << endl; - cout << "edges of the maximum number of edge-disjoint shortest s-t paths: " - << endl; - for(EdgeIt e(g); e!=INVALID; ++e) - if (flow[e]) - cout << " " << g.id(g.source(e)) << "--" - << length[e] << "->" << g.id(g.target(e)) << endl; - \endcode - The program has the following (expected :-)) output: - \code - edges with lengths (of form id, source--length->target): - 9, 5--4->6 - 8, 4--2->6 - 7, 3--1->5 - 6, 2--3->5 - 5, 2--5->6 - 4, 2--2->4 - 3, 1--3->4 - 2, 0--1->3 - 1, 0--2->2 - 0, 0--3->1 - s: 0 t: 6 - maximum number of edge-disjoint shortest path: 2 - edges of the maximum number of edge-disjoint shortest s-t paths: - 9, 5--4->6 - 8, 4--2->6 - 7, 3--1->5 - 4, 2--2->4 - 2, 0--1->3 - 1, 0--2->2 - \endcode - - \author Marton Makai - */ + //x\brief An adaptor for hiding edges from a graph. + //x + //x\warning Graph adaptors are in even more experimental state + //xthan the other parts of the lib. Use them at you own risk. + //x + //xAn adaptor for hiding edges from a graph. + //xThis adaptor specializes SubGraphAdaptor in the way that + //xonly the edge-set + //xcan be filtered. The usefulness of this adaptor is demonstrated in the + //xproblem of searching a maximum number of edge-disjoint shortest paths + //xbetween + //xtwo nodes \c s and \c t. Shortest here means being shortest w.r.t. + //xnon-negative edge-lengths. Note that + //xthe comprehension of the presented solution + //xneed's some elementary knowledge from combinatorial optimization. + //x + //xIf a single shortest path is to be + //xsearched between \c s and \c t, then this can be done easily by + //xapplying the Dijkstra algorithm. What happens, if a maximum number of + //xedge-disjoint shortest paths is to be computed. It can be proved that an + //xedge can be in a shortest path if and only + //xif it is tight with respect to + //xthe potential function computed by Dijkstra. + //xMoreover, any path containing + //xonly such edges is a shortest one. + //xThus we have to compute a maximum number + //xof edge-disjoint paths between \c s and \c t in + //xthe graph which has edge-set + //xall the tight edges. The computation will be demonstrated + //xon the following + //xgraph, which is read from the dimacs file \c sub_graph_adaptor_demo.dim. + //xThe full source code is available in \ref sub_graph_adaptor_demo.cc. + //xIf you are interested in more demo programs, you can use + //x\ref dim_to_dot.cc to generate .dot files from dimacs files. + //xThe .dot file of the following figure was generated by + //xthe demo program \ref dim_to_dot.cc. + //x + //x\dot + //xdigraph lemon_dot_example { + //xnode [ shape=ellipse, fontname=Helvetica, fontsize=10 ]; + //xn0 [ label="0 (s)" ]; + //xn1 [ label="1" ]; + //xn2 [ label="2" ]; + //xn3 [ label="3" ]; + //xn4 [ label="4" ]; + //xn5 [ label="5" ]; + //xn6 [ label="6 (t)" ]; + //xedge [ shape=ellipse, fontname=Helvetica, fontsize=10 ]; + //xn5 -> n6 [ label="9, length:4" ]; + //xn4 -> n6 [ label="8, length:2" ]; + //xn3 -> n5 [ label="7, length:1" ]; + //xn2 -> n5 [ label="6, length:3" ]; + //xn2 -> n6 [ label="5, length:5" ]; + //xn2 -> n4 [ label="4, length:2" ]; + //xn1 -> n4 [ label="3, length:3" ]; + //xn0 -> n3 [ label="2, length:1" ]; + //xn0 -> n2 [ label="1, length:2" ]; + //xn0 -> n1 [ label="0, length:3" ]; + //x} + //x\enddot + //x + //x\code + //xGraph g; + //xNode s, t; + //xLengthMap length(g); + //x + //xreadDimacs(std::cin, g, length, s, t); + //x + //xcout << "edges with lengths (of form id, source--length->target): " << endl; + //xfor(EdgeIt e(g); e!=INVALID; ++e) + //x cout << g.id(e) << ", " << g.id(g.source(e)) << "--" + //x << length[e] << "->" << g.id(g.target(e)) << endl; + //x + //xcout << "s: " << g.id(s) << " t: " << g.id(t) << endl; + //x\endcode + //xNext, the potential function is computed with Dijkstra. + //x\code + //xtypedef Dijkstra Dijkstra; + //xDijkstra dijkstra(g, length); + //xdijkstra.run(s); + //x\endcode + //xNext, we consrtruct a map which filters the edge-set to the tight edges. + //x\code + //xtypedef TightEdgeFilterMap + //x TightEdgeFilter; + //xTightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length); + //x + //xtypedef EdgeSubGraphAdaptor SubGW; + //xSubGW gw(g, tight_edge_filter); + //x\endcode + //xThen, the maximum nimber of edge-disjoint \c s-\c t paths are computed + //xwith a max flow algorithm Preflow. + //x\code + //xConstMap const_1_map(1); + //xGraph::EdgeMap flow(g, 0); + //x + //xPreflow, Graph::EdgeMap > + //x preflow(gw, s, t, const_1_map, flow); + //xpreflow.run(); + //x\endcode + //xLast, the output is: + //x\code + //xcout << "maximum number of edge-disjoint shortest path: " + //x << preflow.flowValue() << endl; + //xcout << "edges of the maximum number of edge-disjoint shortest s-t paths: " + //x << endl; + //xfor(EdgeIt e(g); e!=INVALID; ++e) + //x if (flow[e]) + //x cout << " " << g.id(g.source(e)) << "--" + //x << length[e] << "->" << g.id(g.target(e)) << endl; + //x\endcode + //xThe program has the following (expected :-)) output: + //x\code + //xedges with lengths (of form id, source--length->target): + //x 9, 5--4->6 + //x 8, 4--2->6 + //x 7, 3--1->5 + //x 6, 2--3->5 + //x 5, 2--5->6 + //x 4, 2--2->4 + //x 3, 1--3->4 + //x 2, 0--1->3 + //x 1, 0--2->2 + //x 0, 0--3->1 + //xs: 0 t: 6 + //xmaximum number of edge-disjoint shortest path: 2 + //xedges of the maximum number of edge-disjoint shortest s-t paths: + //x 9, 5--4->6 + //x 8, 4--2->6 + //x 7, 3--1->5 + //x 4, 2--2->4 + //x 2, 0--1->3 + //x 1, 0--2->2 + //x\endcode + //x + //x\author Marton Makai template class EdgeSubGraphAdaptor : public SubGraphAdaptor, @@ -740,12 +769,13 @@ }; - /// \brief An undirected graph is made from a directed graph by an adaptor - /// - /// Undocumented, untested!!! - /// If somebody knows nice demo application, let's polulate it. - /// - /// \author Marton Makai + //x\brief An undirected graph is made from a directed graph by an adaptor + //x\ingroup graph_adaptors + //x + //x Undocumented, untested!!! + //x If somebody knows nice demo application, let's polulate it. + //x + //x \author Marton Makai template class UGraphAdaptor : public IterableUGraphExtender< @@ -793,10 +823,10 @@ typedef typename Parent::Node Node; typedef typename _Graph::Edge GraphEdge; template class EdgeMap; - /// SubBidirGraphAdaptorBase<..., ..., ...>::Edge is inherited from - /// _Graph::Edge. It contains an extra bool flag which is true - /// if and only if the - /// edge is the backward version of the original edge. + // SubBidirGraphAdaptorBase<..., ..., ...>::Edge is inherited from + // _Graph::Edge. It contains an extra bool flag which is true + // if and only if the + // edge is the backward version of the original edge. class Edge : public _Graph::Edge { friend class SubBidirGraphAdaptorBase< Graph, ForwardFilterMap, BackwardFilterMap>; @@ -805,9 +835,9 @@ bool backward; //true, iff backward public: Edge() { } - /// \todo =false is needed, or causes problems? - /// If \c _backward is false, then we get an edge corresponding to the - /// original one, otherwise its oppositely directed pair is obtained. + // \todo =false is needed, or causes problems? + // If \c _backward is false, then we get an edge corresponding to the + // original one, otherwise its oppositely directed pair is obtained. Edge(const typename _Graph::Edge& e, bool _backward/*=false*/) : _Graph::Edge(e), backward(_backward) { } Edge(Invalid i) : _Graph::Edge(i), backward(true) { } @@ -931,16 +961,21 @@ Node target(Edge e) const { return ((!e.backward) ? this->graph->target(e) : this->graph->source(e)); } - /// Gives back the opposite edge. + //x Gives back the opposite edge. + + //x\e + //x Edge opposite(const Edge& e) const { Edge f=e; f.backward=!f.backward; return f; } - /// \warning This is a linear time operation and works only if - /// \c Graph::EdgeIt is defined. - /// \todo hmm + //x\e + + //x \warning This is a linear time operation and works only if + //x \c Graph::EdgeIt is defined. + //x \todo hmm int edgeNum() const { int i=0; Edge e; @@ -951,10 +986,12 @@ bool forward(const Edge& e) const { return !e.backward; } bool backward(const Edge& e) const { return e.backward; } + //x\e + + //x \c SubBidirGraphAdaptorBase<..., ..., ...>::EdgeMap contains two + //x _Graph::EdgeMap one for the forward edges and + //x one for the backward edges. template - /// \c SubBidirGraphAdaptorBase<..., ..., ...>::EdgeMap contains two - /// _Graph::EdgeMap one for the forward edges and - /// one for the backward edges. class EdgeMap { template friend class EdgeMap; typename _Graph::template EdgeMap forward_map, backward_map; @@ -1002,44 +1039,46 @@ }; - ///\brief An adaptor for composing a subgraph of a - /// bidirected graph made from a directed one. - /// - /// An adaptor for composing a subgraph of a - /// bidirected graph made from a directed one. - /// - ///\warning Graph adaptors are in even more experimental state than the other - ///parts of the lib. Use them at you own risk. - /// - /// Let \f$G=(V, A)\f$ be a directed graph and for each directed edge - /// \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by - /// reversing its orientation. We are given moreover two bool valued - /// maps on the edge-set, - /// \f$forward\_filter\f$, and \f$backward\_filter\f$. - /// SubBidirGraphAdaptor implements the graph structure with node-set - /// \f$V\f$ and edge-set - /// \f$\{e : e\in A \mbox{ and } forward\_filter(e) \mbox{ is true}\}+\{\bar e : e\in A \mbox{ and } backward\_filter(e) \mbox{ is true}\}\f$. - /// The purpose of writing + instead of union is because parallel - /// edges can arise. (Similarly, antiparallel edges also can arise). - /// In other words, a subgraph of the bidirected graph obtained, which - /// is given by orienting the edges of the original graph in both directions. - /// As the oppositely directed edges are logically different, - /// the maps are able to attach different values for them. - /// - /// An example for such a construction is \c RevGraphAdaptor where the - /// forward_filter is everywhere false and the backward_filter is - /// everywhere true. We note that for sake of efficiency, - /// \c RevGraphAdaptor is implemented in a different way. - /// But BidirGraphAdaptor is obtained from - /// SubBidirGraphAdaptor by considering everywhere true - /// valued maps both for forward_filter and backward_filter. - /// - /// The most important application of SubBidirGraphAdaptor - /// is ResGraphAdaptor, which stands for the residual graph in directed - /// flow and circulation problems. - /// As adaptors usually, the SubBidirGraphAdaptor implements the - /// above mentioned graph structure without its physical storage, - /// that is the whole stuff is stored in constant memory. + //x\brief An adaptor for composing a subgraph of a + //x bidirected graph made from a directed one. + //x\ingroup graph_adaptors + //x + //x An adaptor for composing a subgraph of a + //x bidirected graph made from a directed one. + //x + //x\warning Graph adaptors are in even more experimental state + //xthan the other + //xparts of the lib. Use them at you own risk. + //x + //x Let \f$G=(V, A)\f$ be a directed graph and for each directed edge + //x \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by + //x reversing its orientation. We are given moreover two bool valued + //x maps on the edge-set, + //x \f$forward\_filter\f$, and \f$backward\_filter\f$. + //x SubBidirGraphAdaptor implements the graph structure with node-set + //x \f$V\f$ and edge-set + //x \f$\{e : e\in A \mbox{ and } forward\_filter(e) \mbox{ is true}\}+\{\bar e : e\in A \mbox{ and } backward\_filter(e) \mbox{ is true}\}\f$. + //x The purpose of writing + instead of union is because parallel + //x edges can arise. (Similarly, antiparallel edges also can arise). + //x In other words, a subgraph of the bidirected graph obtained, which + //x is given by orienting the edges of the original graph in both directions. + //x As the oppositely directed edges are logically different, + //x the maps are able to attach different values for them. + //x + //x An example for such a construction is \c RevGraphAdaptor where the + //x forward_filter is everywhere false and the backward_filter is + //x everywhere true. We note that for sake of efficiency, + //x \c RevGraphAdaptor is implemented in a different way. + //x But BidirGraphAdaptor is obtained from + //x SubBidirGraphAdaptor by considering everywhere true + //x valued maps both for forward_filter and backward_filter. + //x + //x The most important application of SubBidirGraphAdaptor + //x is ResGraphAdaptor, which stands for the residual graph in directed + //x flow and circulation problems. + //x As adaptors usually, the SubBidirGraphAdaptor implements the + //x above mentioned graph structure without its physical storage, + //x that is the whole stuff is stored in constant memory. template class SubBidirGraphAdaptor : @@ -1063,15 +1102,17 @@ - ///\brief An adaptor for composing bidirected graph from a directed one. - /// - ///\warning Graph adaptors are in even more experimental state than the other - ///parts of the lib. Use them at you own risk. - /// - /// An adaptor for composing bidirected graph from a directed one. - /// A bidirected graph is composed over the directed one without physical - /// storage. As the oppositely directed edges are logically different ones - /// the maps are able to attach different values for them. + //x\brief An adaptor for composing bidirected graph from a directed one. + //x\ingroup graph_adaptors + //x + //x\warning Graph adaptors are in even more experimental state + //xthan the other + //xparts of the lib. Use them at you own risk. + //x + //x An adaptor for composing bidirected graph from a directed one. + //x A bidirected graph is composed over the directed one without physical + //x storage. As the oppositely directed edges are logically different ones + //x the maps are able to attach different values for them. template class BidirGraphAdaptor : public SubBidirGraphAdaptor< @@ -1139,38 +1180,41 @@ }; - /*! \brief An adaptor for composing the residual graph for directed flow and circulation problems. - - An adaptor for composing the residual graph for directed flow and circulation problems. - Let \f$G=(V, A)\f$ be a directed graph and let \f$F\f$ be a - number type. Let moreover - \f$f,c:A\to F\f$, be functions on the edge-set. - In the appications of ResGraphAdaptor, \f$f\f$ usually stands for a flow - and \f$c\f$ for a capacity function. - Suppose that a graph instange \c g of type - \c ListGraph implements \f$G\f$. - \code - ListGraph g; - \endcode - Then RevGraphAdaptor implements the graph structure with node-set - \f$V\f$ and edge-set \f$A_{forward}\cup A_{backward}\f$, where - \f$A_{forward}=\{uv : uv\in A, f(uv)0\}\f$, - i.e. the so called residual graph. - When we take the union \f$A_{forward}\cup A_{backward}\f$, - multilicities are counted, i.e. if an edge is in both - \f$A_{forward}\f$ and \f$A_{backward}\f$, then in the adaptor it - appears twice. - The following code shows how - such an instance can be constructed. - \code - typedef ListGraph Graph; - Graph::EdgeMap f(g); - Graph::EdgeMap c(g); - ResGraphAdaptor, Graph::EdgeMap > gw(g); - \endcode - \author Marton Makai - */ + //x\brief An adaptor for composing the residual + //xgraph for directed flow and circulation problems. + //x\ingroup graph_adaptors + //x + //xAn adaptor for composing the residual graph for + //xdirected flow and circulation problems. + //xLet \f$G=(V, A)\f$ be a directed graph and let \f$F\f$ be a + //xnumber type. Let moreover + //x\f$f,c:A\to F\f$, be functions on the edge-set. + //xIn the appications of ResGraphAdaptor, \f$f\f$ usually stands for a flow + //xand \f$c\f$ for a capacity function. + //xSuppose that a graph instange \c g of type + //x\c ListGraph implements \f$G\f$ . + //x\code + //x ListGraph g; + //x\endcode + //xThen RevGraphAdaptor implements the graph structure with node-set + //x\f$V\f$ and edge-set \f$A_{forward}\cup A_{backward}\f$, where + //x\f$A_{forward}=\{uv : uv\in A, f(uv)0\}\f$, + //xi.e. the so called residual graph. + //xWhen we take the union \f$A_{forward}\cup A_{backward}\f$, + //xmultilicities are counted, i.e. if an edge is in both + //x\f$A_{forward}\f$ and \f$A_{backward}\f$, then in the adaptor it + //xappears twice. + //xThe following code shows how + //xsuch an instance can be constructed. + //x\code + //xtypedef ListGraph Graph; + //xGraph::EdgeMap f(g); + //xGraph::EdgeMap c(g); + //xResGraphAdaptor, Graph::EdgeMap > gw(g); + //x\endcode + //x\author Marton Makai + //x template class ResGraphAdaptor : @@ -1220,10 +1264,10 @@ flow->set(e, (*flow)[e]-a); } - /// \brief Residual capacity map. - /// - /// In generic residual graphs the residual capacity can be obtained - /// as a map. + //x \brief Residual capacity map. + //x + //x In generic residual graphs the residual capacity can be obtained + //x as a map. class ResCap { protected: const ResGraphAdaptor* res_graph; @@ -1277,20 +1321,23 @@ }; - /// For blocking flows. - - ///\warning Graph adaptors are in even more - ///experimental state than the other - ///parts of the lib. Use them at you own risk. - /// - ///This graph adaptor is used for on-the-fly - ///Dinits blocking flow computations. - ///For each node, an out-edge is stored which is used when the - ///\code OutEdgeIt& first(OutEdgeIt&, const Node&)\endcode - ///is called. - /// - ///\author Marton Makai - /// + //x\brief For blocking flows. + //x\ingroup graph_adaptors + //x + //x\warning Graph adaptors are in even more + //xexperimental state than the other + //xparts of the lib. Use them at you own risk. + //x + //xThis graph adaptor is used for on-the-fly + //xDinits blocking flow computations. + //xFor each node, an out-edge is stored which is used when the + //x\code + //xOutEdgeIt& first(OutEdgeIt&, const Node&) + //x\endcode + //xis called. + //x + //x\author Marton Makai + //x template class ErasingFirstGraphAdaptor : public IterableGraphExtender< @@ -1347,7 +1394,7 @@ } }; - /// \todo May we want VARIANT/union type + //x \todo May we want VARIANT/union type class Edge : public Parent::Edge { friend class SplitGraphAdaptorBase; template friend class EdgeMap; @@ -1674,8 +1721,6 @@ }; - ///@} - } //namespace lemon #endif //LEMON_GRAPH_ADAPTOR_H