dfs.h

00001 //==========================================================================
00002 //
00003 //   dfs.h
00004 //
00005 //==========================================================================
00006 // $Id: dfs.h,v 1.25 2003/03/24 15:58:54 raitner Exp $
00007 
00008 #ifndef GTL_DFS_H
00009 #define GTL_DFS_H
00010 
00011 #include <GTL/GTL.h>
00012 #include <GTL/algorithm.h>
00013 
00014 __GTL_BEGIN_NAMESPACE
00015 
00087 class GTL_EXTERN dfs : public algorithm 
00088 {
00089 public:
00093     dfs ();
00094 
00095 
00099     virtual ~dfs ();
00100     
00101     int run (graph& G);
00102 
00114     virtual int check (graph& G);
00115 
00116     virtual void reset ();
00117 
00118 
00119     //---------------------------------------------------------------------
00120     //   Parameters
00121     //---------------------------------------------------------------------
00122     
00128     void start_node (const node& n) 
00129         { start = n; }
00130 
00136     node start_node () const {return start;}
00137     
00156     void scan_whole_graph (bool set) {whole_graph = set;}
00157     
00165     bool scan_whole_graph () const {return whole_graph;}
00166 
00173     void calc_comp_num (bool set);
00174 
00181     bool calc_comp_num () const {return comp_number != 0;}
00182 
00183 
00193     void store_preds (bool set);
00194 
00201     bool store_preds () const {return preds != 0;}
00202     
00213     void store_non_tree_edges (bool set);
00214 
00222     bool store_non_tree_edges () const {return back_edges != 0;}
00223 
00224     //---------------------------------------------------------------------
00225     //   Access 
00226     //----------------------------------------------------------------------
00227 
00234     bool reached (const node& n) const
00235         {return dfs_number[n] != 0;}
00236 
00246     int dfs_num (const node& n) const 
00247         {return dfs_number[n];}
00248 
00258     int operator[] (const node& n) const 
00259         {return dfs_number[n];}
00260 
00269     int comp_num (const node& n) const
00270         {assert (comp_number); return (*comp_number)[n];}
00271 
00282     node father (const node& n) const
00283         {assert (preds); return (*preds)[n];}
00284 
00288     typedef list<edge>::const_iterator tree_edges_iterator;
00289 
00299     tree_edges_iterator tree_edges_begin () const 
00300         {return tree.begin();}
00301 
00307     tree_edges_iterator tree_edges_end () const
00308         {return tree.end();}
00309 
00313     typedef list<node>::const_iterator dfs_iterator; 
00314 
00320     dfs_iterator begin () const 
00321         {return dfs_order.begin();}
00322 
00329     dfs_iterator end () const 
00330         {return dfs_order.end();}
00331 
00335     typedef list<edge>::const_iterator non_tree_edges_iterator;
00336 
00343     non_tree_edges_iterator non_tree_edges_begin () const 
00344         {assert (back_edges);  return back_edges->begin(); }
00345 
00353     non_tree_edges_iterator non_tree_edges_end () const 
00354         {assert (back_edges); return back_edges->end(); }
00355 
00359     typedef list<dfs_iterator>::const_iterator roots_iterator;
00360 
00388     roots_iterator roots_begin () const 
00389         {return roots.begin();}
00390 
00397     roots_iterator roots_end () const 
00398         {return roots.end();}
00399 
00406     int number_of_reached_nodes () const
00407         {return reached_nodes;}
00408 
00409 
00410     //-----------------------------------------------------------------------
00411     //   Handler - for customization purposes
00412     //-----------------------------------------------------------------------
00413 
00419     virtual void init_handler (graph& G) {}
00420     
00426     virtual void end_handler (graph& G) {}
00427 
00435     virtual void entry_handler (graph& G, node& n, node& f) {}
00436 
00445     virtual void leave_handler (graph& G, node& n, node& f) {}
00446 
00455     virtual void before_recursive_call_handler (graph& G, edge& e, node& n) {}
00456     
00466     virtual void after_recursive_call_handler (graph& G, edge& e, node& n) {}
00467     
00477     virtual void old_adj_node_handler (graph& G, edge& e, node& n) {}
00478 
00489     virtual void new_start_handler (graph& G, node& n) { };
00490 
00491 private:
00492 
00496     void dfs_sub (graph&, node&, node&);
00497 
00498 protected:    
00499 
00500     //----------------------------------------------------------------------
00501     //   Data
00502     //----------------------------------------------------------------------
00503 
00507     int act_dfs_num;
00511     int act_comp_num;
00515     list<edge> tree;
00519     list<node> dfs_order;
00523     node_map<int> dfs_number;
00527     int reached_nodes;
00531     edge_map<int>* used;
00535     list<dfs_iterator> roots;
00536     
00537 
00538     //-----------------------------------------------------------------------
00539     // Optional 
00540     //-----------------------------------------------------------------------
00541     
00545     node_map<int>* comp_number;
00549     node_map<node>* preds;
00553     list<edge>* back_edges;
00557     node start;
00561     bool whole_graph;
00562 };
00563 
00564 __GTL_END_NAMESPACE
00565 
00566 #endif // GTL_DFS_H
00567 
00568 //--------------------------------------------------------------------------
00569 //   end of file
00570 //--------------------------------------------------------------------------