[Lemon-commits] [lemon_svn] alpar: r2524 - in hugo/trunk: doc lemon

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:53:16 CET 2006


Author: alpar
Date: Fri Feb  3 10:18:17 2006
New Revision: 2524

Modified:
   hugo/trunk/doc/graph-adaptors.dox
   hugo/trunk/lemon/graph_adaptor.h

Log:
Fight with Doxygen.
Victory hasn't been reached yet, but it's on the horizon.

Modified: hugo/trunk/doc/graph-adaptors.dox
==============================================================================
--- hugo/trunk/doc/graph-adaptors.dox	(original)
+++ hugo/trunk/doc/graph-adaptors.dox	Fri Feb  3 10:18:17 2006
@@ -1,7 +1,7 @@
 /**
    @defgroup graph_adaptors Adaptor Classes for Graphs
-   \brief This group contains several adaptor classes for graphs
    @ingroup graphs
+   \brief This group contains several adaptor classes for graphs
    
    The main parts of LEMON are the different graph structures, 
    generic graph algorithms, graph concepts which couple these, and 

Modified: hugo/trunk/lemon/graph_adaptor.h
==============================================================================
--- hugo/trunk/lemon/graph_adaptor.h	(original)
+++ hugo/trunk/lemon/graph_adaptor.h	Fri Feb  3 10:18:17 2006
@@ -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<typename _Graph>
   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<ListGraph> gw(g);
   ///\endcode
-  ///\author Marton Makai
+  ///implements the graph obtained from \c g by 
+  /// reversing the orientation of its edges.
 
   template<typename _Graph>
   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.
-
-  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<bool> nm(g, true);
-  nm.set(u, false);
-  Graph::EdgeMap<bool> em(g, true);
-  em.set(e, false);
-  typedef SubGraphAdaptor<Graph, Graph::NodeMap<bool>, Graph::EdgeMap<bool> > 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.
+  //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<bool> nm(g, true);
+  //xnm.set(u, false);
+  //xGraph::EdgeMap<bool> em(g, true);
+  //xem.set(e, false);
+  //xtypedef SubGraphAdaptor<Graph, Graph::NodeMap<bool>, Graph::EdgeMap<bool> > 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
 
-  \author Marton Makai
-  */
   template<typename _Graph, typename NodeFilterMap, 
 	   typename EdgeFilterMap, bool checked = true>
   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<typename Graph, typename NodeFilterMap, bool checked = true>
   class NodeSubGraphAdaptor : 
     public SubGraphAdaptor<Graph, NodeFilterMap, 
@@ -523,137 +547,142 @@
   };
 
 
-  /*! \brief An adaptor for hiding 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.
-  
-  An adaptor for hiding edges from a graph.
-  This adaptor specializes SubGraphAdaptor in the way that only the edge-set 
-  can be filtered. The usefulness of this adaptor is demonstrated in the 
-  problem of searching a maximum number of edge-disjoint shortest paths 
-  between 
-  two nodes \c s and \c t. Shortest here means being shortest w.r.t. 
-  non-negative edge-lengths. Note that 
-  the comprehension of the presented solution 
-  need's some elementary knowledge from combinatorial optimization. 
-
-  If a single shortest path is to be 
-  searched between \c s and \c t, then this can be done easily by 
-  applying the Dijkstra algorithm. What happens, if a maximum number of 
-  edge-disjoint shortest paths is to be computed. It can be proved that an 
-  edge can be in a shortest path if and only if it is tight with respect to 
-  the potential function computed by Dijkstra. Moreover, any path containing 
-  only such edges is a shortest one. Thus we have to compute a maximum number 
-  of edge-disjoint paths between \c s and \c t in the graph which has edge-set 
-  all the tight edges. The computation will be demonstrated on the following 
-  graph, which is read from the dimacs file \c sub_graph_adaptor_demo.dim. 
-  The full source code is available in \ref sub_graph_adaptor_demo.cc. 
-  If you are interested in more demo programs, you can use 
-  \ref dim_to_dot.cc to generate .dot files from dimacs files. 
-  The .dot file of the following figure was generated by  
-  the demo program \ref dim_to_dot.cc.
-
-  \dot
-  digraph lemon_dot_example {
-  node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
-  n0 [ label="0 (s)" ];
-  n1 [ label="1" ];
-  n2 [ label="2" ];
-  n3 [ label="3" ];
-  n4 [ label="4" ];
-  n5 [ label="5" ];
-  n6 [ label="6 (t)" ];
-  edge [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
-  n5 ->  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<Graph, LengthMap> 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<Graph, const Dijkstra::DistMap, LengthMap> 
-    TightEdgeFilter;
-  TightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length);
-  
-  typedef EdgeSubGraphAdaptor<Graph, TightEdgeFilter> 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<Edge, int> const_1_map(1);
-  Graph::EdgeMap<int> flow(g, 0);
-
-  Preflow<SubGW, int, ConstMap<Edge, int>, Graph::EdgeMap<int> > 
-    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<Graph, LengthMap> 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<Graph, const Dijkstra::DistMap, LengthMap> 
+  //x  TightEdgeFilter;
+  //xTightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length);
+  //x
+  //xtypedef EdgeSubGraphAdaptor<Graph, TightEdgeFilter> 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<Edge, int> const_1_map(1);
+  //xGraph::EdgeMap<int> flow(g, 0);
+  //x
+  //xPreflow<SubGW, int, ConstMap<Edge, int>, Graph::EdgeMap<int> > 
+  //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<typename Graph, typename EdgeFilterMap>
   class EdgeSubGraphAdaptor : 
     public SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, 
@@ -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<typename _Graph>
   class UGraphAdaptor : 
     public IterableUGraphExtender<
@@ -793,10 +823,10 @@
     typedef typename Parent::Node Node;
     typedef typename _Graph::Edge GraphEdge;
     template <typename T> 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 <typename T>
-    /// \c SubBidirGraphAdaptorBase<..., ..., ...>::EdgeMap contains two 
-    /// _Graph::EdgeMap one for the forward edges and 
-    /// one for the backward edges.
     class EdgeMap {
       template <typename TT> friend class EdgeMap;
       typename _Graph::template EdgeMap<T> 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<typename _Graph, 
 	   typename ForwardFilterMap, typename BackwardFilterMap>
   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<typename Graph>
   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)<c(uv)\}\f$ and 
-  \f$A_{backward}=\{vu : 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<int> f(g);
-  Graph::EdgeMap<int> c(g);
-  ResGraphAdaptor<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > 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)<c(uv)\}\f$ and 
+  //x\f$A_{backward}=\{vu : 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<int> f(g);
+  //xGraph::EdgeMap<int> c(g);
+  //xResGraphAdaptor<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > gw(g);
+  //x\endcode
+  //x\author Marton Makai
+  //x
   template<typename Graph, typename Number, 
 	   typename CapacityMap, typename FlowMap>
   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<Graph, Number, CapacityMap, FlowMap>* 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 <typename _Graph, typename FirstOutEdgesMap>
   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 <typename T> friend class EdgeMap;
@@ -1674,8 +1721,6 @@
 
   };
 
-  ///@}
-
 } //namespace lemon
 
 #endif //LEMON_GRAPH_ADAPTOR_H



More information about the Lemon-commits mailing list