Home | Documentation | Download | Platforms | Projects | Mailing Lists | Version History
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 //--------------------------------------------------------------------------
University of Passau - FMI - Theoretical Computer Science