[Lemon-commits] [lemon_svn] marci: r1293 - hugo/trunk/src/work/marci

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


Author: marci
Date: Sat Oct 16 02:20:13 2004
New Revision: 1293

Added:
   hugo/trunk/src/work/marci/bfs_mm.h
      - copied, changed from r1290, /hugo/trunk/src/work/marci/bfs_dfs.h
   hugo/trunk/src/work/marci/bfs_mm_test.cc
      - copied, changed from r1290, /hugo/trunk/src/test/bfs_test.cc
Modified:
   hugo/trunk/src/work/marci/augmenting_flow.h
   hugo/trunk/src/work/marci/bfsit_vs_byhand.cc
   hugo/trunk/src/work/marci/makefile

Log:
It's time to design an iterable generic bfs


Modified: hugo/trunk/src/work/marci/augmenting_flow.h
==============================================================================
--- hugo/trunk/src/work/marci/augmenting_flow.h	(original)
+++ hugo/trunk/src/work/marci/augmenting_flow.h	Sat Oct 16 02:20:13 2004
@@ -6,16 +6,19 @@
 #include <iostream>
 
 #include <lemon/graph_wrapper.h>
-#include <bfs_dfs.h>
+//#include <bfs_dfs.h>
+#include <bfs_mm.h>
 #include <lemon/invalid.h>
 #include <lemon/maps.h>
-#include <lemon/tight_edge_filter_map.h>
+#include <demo/tight_edge_filter_map.h>
 
 /// \file
 /// \brief Maximum flow algorithms.
 /// \ingroup galgs
 
 namespace lemon {
+  using lemon::marci::BfsIterator;
+  using lemon::marci::DfsIterator;
 
   /// \addtogroup galgs
   /// @{                                                                                                                                        
@@ -109,6 +112,8 @@
       IntMap* map;
       int* number_of_augmentations;
     public:
+      typedef Node KeyType;
+      typedef bool ValueType;
       TrickyReachedMap(IntMap& _map, int& _number_of_augmentations) : 
 	map(&_map), number_of_augmentations(&_number_of_augmentations) { }
       void set(const Node& n, bool b) {

Copied: hugo/trunk/src/work/marci/bfs_mm.h (from r1290, /hugo/trunk/src/work/marci/bfs_dfs.h)
==============================================================================
--- /hugo/trunk/src/work/marci/bfs_dfs.h	(original)
+++ hugo/trunk/src/work/marci/bfs_mm.h	Sat Oct 16 02:20:13 2004
@@ -17,56 +17,64 @@
 #include <lemon/invalid.h>
 
 namespace lemon {
+  namespace marci {
 
   /// Bfs searches for the nodes wich are not marked in 
   /// \c reached_map
-  /// Reached have to be a read-write bool node-map.
+  /// RM have to be a read-write bool node-map.
   /// \ingroup galgs
   template <typename Graph, /*typename OutEdgeIt,*/ 
-	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
+	    typename RM/*=typename Graph::NodeMap<bool>*/ >
   class BfsIterator {
+  public:
+    typedef RM ReachedMap;
   protected:
     typedef typename Graph::Node Node;
     typedef typename Graph::Edge Edge;
     typedef typename Graph::OutEdgeIt OutEdgeIt;
     const Graph* graph;
     std::queue<Node> bfs_queue;
-    ReachedMap& reached;
+    ReachedMap* reached_map;
     bool b_node_newly_reached;
+    //OutEdgeIt actual_edge;
     Edge actual_edge;
-    bool own_reached_map;
+    /// \e
+    BfsIterator(const Graph& _graph) : graph(&_graph), reached_map(0) { }
+    /// RM have to be set before any bfs operation.
+    BfsIterator<Graph, RM>& setReached(RM& _reached_map) {
+      reached_map=&_reached_map;
+    }
   public:
-    /// In that constructor \c _reached have to be a reference 
+    /// In that constructor \c _reached_map have to be a reference 
     /// for a bool bode-map. The algorithm will search for the 
     /// initially \c false nodes 
     /// in a bfs order.
-    BfsIterator(const Graph& _graph, ReachedMap& _reached) : 
-      graph(&_graph), reached(_reached), 
-      own_reached_map(false) { }
+    BfsIterator(const Graph& _graph, ReachedMap& _reached_map) : 
+      graph(&_graph), reached_map(&_reached_map) { }
     /// The same as above, but the map storing the reached nodes 
     /// is constructed dynamically to everywhere false.
     /// \deprecated
-    BfsIterator(const Graph& _graph) : 
-      graph(&_graph), reached(*(new ReachedMap(*graph /*, false*/))), 
-      own_reached_map(true) { }
-    /// The map storing the reached nodes have to be destroyed if 
-    /// it was constructed dynamically
-    ~BfsIterator() { if (own_reached_map) delete &reached; }
+//     BfsIterator(const Graph& _graph) : 
+//       graph(&_graph), reached_map(new ReachedMap(*graph /*, false*/)), 
+//       own_reached_map(true) { }
+//     /// The map storing the reached nodes have to be destroyed if 
+//     /// it was constructed dynamically
+//     ~BfsIterator() { if (own_reached_map) delete reached_map; }
     /// This method markes \c s reached.
     /// If the queue is empty, then \c s is pushed in the bfs queue 
     /// and the first out-edge is processed.
     /// If the queue is not empty, then \c s is simply pushed.
     BfsIterator<Graph, /*OutEdgeIt,*/ ReachedMap>& pushAndSetReached(Node s) { 
-      reached.set(s, true);
+      reached_map->set(s, true);
       if (bfs_queue.empty()) {
 	bfs_queue.push(s);
 	actual_edge=OutEdgeIt(*graph, s);
 	//graph->first(actual_edge, s);
 	if (actual_edge!=INVALID) { 
 	  Node w=graph->head(actual_edge);
-	  if (!reached[w]) {
+	  if (!(*reached_map)[w]) {
 	    bfs_queue.push(w);
-	    reached.set(w, true);
+	    reached_map->set(w, true);
 	    b_node_newly_reached=true;
 	  } else {
 	    b_node_newly_reached=false;
@@ -86,9 +94,9 @@
 	//++actual_edge;
 	if (actual_edge!=INVALID) {
 	  Node w=graph->head(actual_edge);
-	  if (!reached[w]) {
+	  if (!(*reached_map)[w]) {
 	    bfs_queue.push(w);
-	    reached.set(w, true);
+	    reached_map->set(w, true);
 	    b_node_newly_reached=true;
 	  } else {
 	    b_node_newly_reached=false;
@@ -101,9 +109,9 @@
 	  //graph->first(actual_edge, bfs_queue.front());
 	  if (actual_edge!=INVALID) {
 	    Node w=graph->head(actual_edge);
-	    if (!reached[w]) {
+	    if (!(*reached_map)[w]) {
 	      bfs_queue.push(w);
-	      reached.set(w, true);
+	      reached_map->set(w, true);
 	      b_node_newly_reached=true;
 	    } else {
 	      b_node_newly_reached=false;
@@ -129,7 +137,12 @@
     Node head() const { return graph->head(actual_edge); }
     /// Guess what?
     /// \deprecated 
-    const ReachedMap& getReachedMap() const { return reached; }
+    const ReachedMap& reachedMap() const { return *reached_map; }
+    /// Guess what?
+    /// \deprecated 
+    typename ReachedMap::ValueType reached(const Node& n) const { 
+      return (*reached_map)[n]; 
+    }
     /// Guess what?
     /// \deprecated
     const std::queue<Node>& getBfsQueue() const { return bfs_queue; }
@@ -137,68 +150,266 @@
 
   /// Bfs searches for the nodes wich are not marked in 
   /// \c reached_map
-  /// Reached have to work as a read-write bool Node-map, 
-  /// Pred is a write edge node-map and
-  /// Dist is a read-write node-map of integral value, have to be. 
+  /// RM have to work as a read-write bool Node-map, 
+  /// PM is a write edge node-map and
+  /// PNM is a write node node-map and
+  /// DM is a read-write node-map of integral value, have to be. 
   /// \ingroup galgs
   template <typename Graph, 
-	    typename ReachedMap=typename Graph::template NodeMap<bool>, 
-	    typename PredMap
+	    typename RM=typename Graph::template NodeMap<bool>, 
+	    typename PM
 	    =typename Graph::template NodeMap<typename Graph::Edge>, 
-	    typename DistMap=typename Graph::template NodeMap<int> > 
-  class Bfs : public BfsIterator<Graph, ReachedMap> {
-    typedef BfsIterator<Graph, ReachedMap> Parent;
+	    typename PNM
+	    =typename Graph::template NodeMap<typename Graph::Node>, 
+	    typename DM=typename Graph::template NodeMap<int> > 
+  class Bfs : public BfsIterator<Graph, RM> {
+    typedef BfsIterator<Graph, RM> Parent;
+  public:
+    typedef RM ReachedMap;
+    typedef PM PredMap;
+    typedef PNM PredNodeMap;
+    typedef DM DistMap;
   protected:
     typedef typename Parent::Node Node;
-    PredMap& pred;
-    DistMap& dist;
+    PredMap* pred_map;
+    PredNodeMap* pred_node_map;
+    DistMap* dist_map;
+    /// \e
+    Bfs<Graph, RM, PM, PNM, DM>
+    (const Graph& _graph) : BfsIterator<Graph, RM>(_graph) { }
+    /// PM have to be set before any bfs operation.
+    Bfs<Graph, RM, PM, PNM, DM>& 
+    setPredMap(PredMap& _pred_map) {
+      pred_map=&_pred_map;
+    }
+    /// PredNodeMap have to be set before any bfs operation.
+    Bfs<Graph, RM, PM, PNM, DM>& 
+    setPredNodeMap(PredNodeMap& _pred_node_map) {
+      pred_node_map=&_pred_node_map;
+    }
+    /// DistMap have to be set before any bfs operation.
+    Bfs<Graph, RM, PM, PNM, DM>& 
+    setDistMap(DistMap& _dist_map) {
+      dist_map=&_dist_map;
+    }
   public:
     /// The algorithm will search in a bfs order for 
     /// the nodes which are \c false initially. 
     /// The constructor makes no initial changes on the maps.
-    Bfs<Graph, ReachedMap, PredMap, DistMap>(const Graph& _graph, ReachedMap& _reached, PredMap& _pred, DistMap& _dist) : 
-      BfsIterator<Graph, ReachedMap>(_graph, _reached), 
-      pred(_pred), dist(_dist) { }
+    Bfs<Graph, RM, PM, PNM, DM>
+    (const Graph& _graph, ReachedMap& _reached_map, 
+     PredMap& _pred_map, PredNodeMap& _pred_node_map, 
+     DistMap& _dist_map) : BfsIterator<Graph, RM>(_graph, _reached_map), 
+      pred_map(&_pred_map), pred_node_map(&_pred_node_map), 
+			   dist_map(&_dist_map) { }
     /// \c s is marked to be reached and pushed in the bfs queue.
     /// If the queue is empty, then the first out-edge is processed.
     /// If \c s was not marked previously, then 
-    /// in addition its pred is set to be \c INVALID, and dist to \c 0. 
+    /// in addition its pred_map is set to be \c INVALID, 
+    /// and dist_map to \c 0. 
     /// if \c s was marked previuosly, then it is simply pushed.
-    Bfs<Graph, ReachedMap, PredMap, DistMap>& push(Node s) { 
-      if (this->reached[s]) {
+    Bfs<Graph, RM, PM, PNM, DM>& push(Node s) { 
+      if ((*(this->reached_map))[s]) {
 	Parent::pushAndSetReached(s);
       } else {
 	Parent::pushAndSetReached(s);
-	pred.set(s, INVALID);
-	dist.set(s, 0);
+	pred_map->set(s, INVALID);
+	pred_node_map->set(s, INVALID);
+	dist_map->set(s, 0);
       }
       return *this;
     }
     /// A bfs is processed from \c s.
-    Bfs<Graph, ReachedMap, PredMap, DistMap>& run(Node s) {
+    Bfs<Graph, RM, PM, PNM, DM>& run(Node s) {
       push(s);
       while (!this->finished()) this->operator++();
       return *this;
     }
-    /// Beside the bfs iteration, \c pred and \dist are saved in a 
+    /// Beside the bfs iteration, \c pred_map and \dist_map are saved in a 
     /// newly reached node. 
-    Bfs<Graph, ReachedMap, PredMap, DistMap>& operator++() {
+    Bfs<Graph, RM, PM, PNM, DM>& operator++() {
       Parent::operator++();
-      if (this->graph->valid(this->actual_edge) && this->b_node_newly_reached) 
+      if ((this->actual_edge)!=INVALID && this->b_node_newly_reached) 
       {
-	pred.set(this->head(), this->actual_edge);
-	dist.set(this->head(), dist[this->tail()]);
+	pred_map->set(this->head(), this->actual_edge);
+	pred_node_map->set(this->head(), this->tail());
+	dist_map->set(this->head(), (*dist_map)[this->tail()]);
       }
       return *this;
     }
     /// Guess what?
     /// \deprecated 
-    const PredMap& getPredMap() const { return pred; }
+    const PredMap& predMap() const { return *pred_map; }
+    /// Guess what?
+    /// \deprecated 
+    typename PredMap::ValueType pred(const Node& n) const { 
+      return (*pred_map)[n]; 
+    }
+    /// Guess what?
+    /// \deprecated 
+    const PredNodeMap& predNodeMap() const { return *pred_node_map; }
+    /// Guess what?
+    /// \deprecated 
+    typename PredNodeMap::ValueType predNode(const Node& n) const { 
+      return (*pred_node_map)[n]; 
+    }
     /// Guess what?
     /// \deprecated
-    const DistMap& getDistMap() const { return dist; }
+    const DistMap& distMap() const { return *dist_map; }
+    /// Guess what?
+    /// \deprecated 
+    typename DistMap::ValueType dist(const Node& n) const { 
+      return (*dist_map)[n]; 
+    }
   };
 
+//   template <typename Graph, 
+// 	    typename RM=typename Graph::template NodeMap<bool>, 
+// 	    typename PM
+// 	    =typename Graph::template NodeMap<typename Graph::Edge>, 
+// 	    typename PredNodeMap
+// 	    =typename Graph::template NodeMap<typename Graph::Node>, 
+// 	    typename DistMap=typename Graph::template NodeMap<int> > 
+//     class BfsWizard : public Bfs<Graph> {
+//     public:
+//       typedef Bfs<Graph, PM, PredNodeMap, DistMap> Parent;
+//     protected:
+//       typedef typename Parent::Node Node;
+//       bool own_reached_map;
+//       bool own_pred_map;
+//       bool own_pred_node_map;
+//       bool own_dist_map;
+
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       makeRreached() { 
+// 	own_reached_map=true;
+// 	reached=new ReachedMap(*graph, false);
+//       }
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       deleteReachedMap() { 
+// 	own_reached_map=false;
+// 	delete reached;
+//       }
+
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       makePM() { 
+// 	own_pred_map=true;
+// 	pred_map=new PM(*graph, INVALID);
+//       }
+//       BfsWizard<Graph, ReachedMap, PM, PredNodeMap, DistMap>& 
+//       deletePM() { 
+// 	own_pred_map=false;
+// 	delete pred_map;
+//       }
+
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       makePredNodeMap() { 
+// 	own_pred_node_map=true;
+// 	pred_node_map=new PredNodeMap(*graph, INVALID);
+//       }
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       deletePredNodeMap() { 
+// 	own_pred_node_map=false;
+// 	delete pred_node_map;
+//       }
+
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       makeDistMap() { 
+// 	own_dist_map=true;
+// 	dist_map=new DistMap(*graph, 0);
+//       }
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       deleteDistMap() { 
+// 	own_dist_map=false;
+// 	delete dist_map;
+//       }
+
+//     public:
+//       /// User friendly Bfs class.
+//       /// The maps which are not explicitly given by the user are 
+//       /// constructed with false, INVALID, INVALID and 0 values.
+//       /// For the user defined maps, the values are not modified, and 
+//       /// the bfs is processed without any preset on maps. Therefore, 
+//       /// the bfs will search only the nodes which are set false previously 
+//       /// in reached, and in the nodes wich are not newly reached by the 
+//       /// search, the map values are not modified.
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>
+//       (const Graph& _graph) : 
+// 	own_reached_map(false), 
+// 	own_pred_map(false), 
+// 	own_pred_node_map(false), 
+// 	own_dist_map(false) { 
+//       }
+
+//       /// \e
+//       ~BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>() { 
+// 	if (own_reached_map) deleteReachedMap();
+// 	if (own_pred_map) deletePM();
+// 	if (own_pred_node_map) deletePredNodeMap();
+// 	if (own_dist_map) deleteDistMap();
+//       }
+
+//       /// \e
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       setReachedMap(ReachedMap& _reached) {
+// 	if (own_reached_map) deleteReachedMap();
+// 	Parent::setReachedMap(_reached);
+//       }
+//       /// \e
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       setPM(PM& _pred) {
+// 	if (own_pred_map) deletePM();
+// 	Parent::setPM(_pred);
+//       }
+//       /// \e
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       setPredNodeMap(PredNodeMap& _pred_node) {
+// 	if (own_pred_node_map) deletePredNodeMap();
+// 	Parent::setPredNodeMap(_pred_node);
+//       }
+//       /// \e
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       setDistMap(DistMap& _dist) {
+// 	if (own_dist_map) deleteDistMap();
+// 	Parent::setDistMap(_dist);
+//       }
+
+//       /// \e
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       push(Node s) { 
+// 	if (!reached) makeReachedMap();
+// 	if (!pred_map) makePMMap();
+// 	if (!pred_node_map) makePredNodeMap();
+// 	if (!dist_map) makeDistMap();
+// 	push(s);
+// 	return *this;
+//       }
+
+//       /// \e
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       operator++() { 
+// 	if (!reached) makeRM();
+// 	if (!pred_map) makePMMap();
+// 	if (!pred_node_map) makePredNodeMap();
+// 	if (!dist_map) makeDistMap();
+// 	++(*this);
+// 	return *this;
+//       }
+
+//       /// \e
+//       BfsWizard<Graph, RM, PM, PredNodeMap, DistMap>& 
+//       run(Node s) { 
+// 	if (!reached) makeRM();
+// 	if (!pred_map) makePMMap();
+// 	if (!pred_node_map) makePredNodeMap();
+// 	if (!dist_map) makeDistMap();
+// 	run(s);
+// 	return *this;
+//       }
+      
+//     };
+
+
   /// Dfs searches for the nodes wich are not marked in 
   /// \c reached_map
   /// Reached have to be a read-write bool Node-map.
@@ -342,7 +553,7 @@
     const PredMap& getPredMap() const { return pred; }
   };
 
-
+  } // namespace marci
 } // namespace lemon
 
 #endif //LEMON_BFS_DFS_H

Copied: hugo/trunk/src/work/marci/bfs_mm_test.cc (from r1290, /hugo/trunk/src/test/bfs_test.cc)
==============================================================================
--- /hugo/trunk/src/test/bfs_test.cc	(original)
+++ hugo/trunk/src/work/marci/bfs_mm_test.cc	Sat Oct 16 02:20:13 2004
@@ -14,10 +14,10 @@
  *
  */
 
-#include "test_tools.h"
+#include <test/test_tools.h>
 #include <lemon/smart_graph.h>
-#include <lemon/bfs.h>
-#include<lemon/skeletons/graph.h>
+#include <bfs_mm.h>
+#include <lemon/skeletons/graph.h>
 
 using namespace lemon;
 
@@ -33,7 +33,7 @@
   typedef Graph::EdgeIt EdgeIt;
   typedef Graph::NodeIt NodeIt;
  
-  typedef Bfs<Graph> BType;
+  typedef marci::Bfs<Graph> BType;
   
   Graph G;
   Node n;
@@ -43,8 +43,12 @@
   BType::DistMap d(G);
   BType::PredMap p(G);
   BType::PredNodeMap pn(G);
-  
-  BType bfs_test(G);
+
+   Graph::NodeMap<bool> reached(G);
+   Graph::NodeMap<Edge> pred(G);
+   Graph::NodeMap<Node> pred_node(G);
+   Graph::NodeMap<int> dist(G);  
+   BType bfs_test(G, reached, pred, pred_node, dist);
   
   bfs_test.run(n);
   
@@ -76,31 +80,35 @@
   s=ps.outer[2];
   t=ps.inner[0];
   
-  Bfs<Graph> bfs_test(G);
+   Graph::NodeMap<bool> reached(G);
+   Graph::NodeMap<Edge> pred(G);
+   Graph::NodeMap<Node> pred_node(G);
+   Graph::NodeMap<int> dist(G);
+   marci::Bfs<Graph> bfs_test(G, reached, pred, pred_node, dist);
   bfs_test.run(s);
   
-  check(bfs_test.dist(t)==3,"Bfs found a wrong path. " << bfs_test.dist(t));
+//   check(bfs_test.dist(t)==3,"Bfs found a wrong path. " << bfs_test.dist(t));
 
 
-  for(EdgeIt e(G); e==INVALID; ++e) {
-    Node u=G.tail(e);
-    Node v=G.head(e);
-    check( !bfs_test.reached(u) ||
-	   (bfs_test.dist(v) > bfs_test.dist(u)+1),
-	   "Wrong output.");
-  }
-
-  for(NodeIt v(G); v==INVALID; ++v) {
-    check(bfs_test.reached(v),"Each node should be reached.");
-    if ( bfs_test.pred(v)!=INVALID ) {
-      Edge e=bfs_test.pred(v);
-      Node u=G.tail(e);
-      check(u==bfs_test.predNode(v),"Wrong tree.");
-      check(bfs_test.dist(v) - bfs_test.dist(u) == 1,
-	    "Wrong distance. Difference: " 
-	    << std::abs(bfs_test.dist(v) - bfs_test.dist(u) 
-			- 1));
-    }
-  }
+//   for(EdgeIt e(G); e==INVALID; ++e) {
+//     Node u=G.tail(e);
+//     Node v=G.head(e);
+//     check( !bfs_test.reached(u) ||
+// 	   (bfs_test.dist(v) > bfs_test.dist(u)+1),
+// 	   "Wrong output.");
+//   }
+
+//   for(NodeIt v(G); v==INVALID; ++v) {
+//     check(bfs_test.reached(v),"Each node should be reached.");
+//     if ( bfs_test.pred(v)!=INVALID ) {
+//       Edge e=bfs_test.pred(v);
+//       Node u=G.tail(e);
+//       check(u==bfs_test.predNode(v),"Wrong tree.");
+//       check(bfs_test.dist(v) - bfs_test.dist(u) == 1,
+// 	    "Wrong distance. Difference: " 
+// 	    << std::abs(bfs_test.dist(v) - bfs_test.dist(u) 
+// 			- 1));
+//     }
+//   }
 }
 

Modified: hugo/trunk/src/work/marci/bfsit_vs_byhand.cc
==============================================================================
--- hugo/trunk/src/work/marci/bfsit_vs_byhand.cc	(original)
+++ hugo/trunk/src/work/marci/bfsit_vs_byhand.cc	Sat Oct 16 02:20:13 2004
@@ -2,12 +2,14 @@
 #include <iostream>
 #include <fstream>
 
-#include <sage_graph.h>
+//#include <sage_graph.h>
 #include <lemon/smart_graph.h>
+#include <lemon/list_graph.h>
 #include <lemon/dimacs.h>
 #include <lemon/time_measure.h>
 //#include <lemon/for_each_macros.h>
-#include <bfs_dfs.h>
+#include <bfs_mm.h>
+#include <lemon/bfs.h>
 
 using namespace lemon;
 
@@ -15,7 +17,9 @@
 using std::endl;
 
 int main() {
-  typedef SageGraph Graph; 
+  //  typedef SageGraph Graph; 
+  typedef SmartGraph Graph ;
+  //typedef ListGraph Graph; 
   typedef Graph::Node Node;
   typedef Graph::NodeIt NodeIt;
   typedef Graph::Edge Edge;
@@ -23,12 +27,8 @@
   typedef Graph::OutEdgeIt OutEdgeIt;
 
   Graph g;
-  //Node s;
-  //Graph::EdgeMap<int> cap(g);
-  //readDimacsMaxFlow(std::cin, g, s, t, cap);
   readDimacs(std::cin, g);
-  NodeIt s;
-  g.first(s);
+  NodeIt s(g);
 
   cout << g.nodeNum() << endl;
   cout << g.edgeNum() << endl;
@@ -36,8 +36,9 @@
   Graph::NodeMap<Edge> pred(g);
   cout << "iteration time of bfs written by hand..." << endl;
   Timer ts;
+  ts.reset();
+  for (int i=0; i<100; ++i)
   {
-    ts.reset();
     Graph::NodeMap<bool> reached(g);
     reached.set(s, true);
     pred.set(s, INVALID);
@@ -46,8 +47,7 @@
     while (!bfs_queue.empty()) {
       Node v=bfs_queue.front();	
       bfs_queue.pop();
-      OutEdgeIt e;
-      for(g.first(e,v); g.valid(e); g.next(e)) {
+      for(OutEdgeIt e(g,v); e!=INVALID; ++e) {
 	Node w=g.head(e);
 	if (!reached[w]) {
 	  bfs_queue.push(w);
@@ -56,23 +56,35 @@
 	}
       }
     }
-
-    std::cout << ts << std::endl;
   }
+  std::cout << ts << std::endl;
 
   cout << "iteration time with bfs iterator..." << endl;
+  ts.reset();      
+  for (int i=0; i<100; ++i)
   {
-    ts.reset();      
-    BfsIterator< Graph, Graph::NodeMap<bool> > bfs(g);
+    Graph::NodeMap<bool> reached(g);
+    marci::BfsIterator< Graph, Graph::NodeMap<bool> > bfs(g, reached);
     bfs.pushAndSetReached(s);
     pred.set(s, INVALID);
     while (!bfs.finished()) { 
       ++bfs; 
-      if (g.valid(bfs) && bfs.isBNodeNewlyReached()) 
+      if (Graph::Edge(bfs)!=INVALID && bfs.isBNodeNewlyReached()) 
 	pred.set(bfs.head(), Graph::Edge(bfs));
     }
-    std::cout << ts << std::endl;
   }
+  std::cout << ts << std::endl;
+
+  cout << "iteration time with bfs aplar..." << endl;
+  ts.reset();      
+  for (int i=0; i<100; ++i)
+  {
+    Bfs<Graph> bfs(g);
+    bfs.setPredMap(pred);
+    bfs.run(s);
+  }
+  std::cout << ts << std::endl;
+
 
   return 0;
 }

Modified: hugo/trunk/src/work/marci/makefile
==============================================================================
--- hugo/trunk/src/work/marci/makefile	(original)
+++ hugo/trunk/src/work/marci/makefile	Sat Oct 16 02:20:13 2004
@@ -4,7 +4,7 @@
 INCLUDEDIRS ?= -I../{jacint,marci,alpar,klao,akos,athos} -I../.. -I.. -I$(BOOSTROOT)
 
 LEDABINARIES = leda_graph_demo leda_bfs_dfs max_bipartite_matching_demo
-BINARIES = merge_node_graph_wrapper_test#sub_graph_wrapper_demo.cc graph_wrapper_time max_flow_demo iterator_bfs_demo macro_test lg_vs_sg_vs_sg bfsit_vs_byhand bipartite_graph_wrapper_test bipartite_matching_demo top_sort_test max_flow_1 proba7 proba10 
+BINARIES = bfsit_vs_byhand max_flow_demo bfs_mm_test#merge_node_graph_wrapper_test sub_graph_wrapper_demo.cc graph_wrapper_time iterator_bfs_demo macro_test lg_vs_sg_vs_sg bipartite_graph_wrapper_test bipartite_matching_demo top_sort_test max_flow_1 proba7 proba10 
 #BINARIES = preflow_bug
 #gw_vs_not preflow_demo_boost edmonds_karp_demo_boost preflow_demo_jacint preflow_demo_athos edmonds_karp_demo_alpar preflow_demo_leda
 



More information about the Lemon-commits mailing list