bfs.h

Go to the documentation of this file.
00001 /* -*- C++ -*- 00002 * src/lemon/bfs.h - Part of LEMON, a generic C++ optimization library 00003 * 00004 * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 00005 * (Egervary Combinatorial Optimization Research Group, EGRES). 00006 * 00007 * Permission to use, modify and distribute this software is granted 00008 * provided that this copyright notice appears in all copies. For 00009 * precise terms see the accompanying LICENSE file. 00010 * 00011 * This software is provided "AS IS" with no warranty of any kind, 00012 * express or implied, and with no claim as to its suitability for any 00013 * purpose. 00014 * 00015 */ 00016 00017 #ifndef LEMON_BFS_H 00018 #define LEMON_BFS_H 00019 00025 00026 #include <lemon/bin_heap.h> 00027 #include <lemon/invalid.h> 00028 00029 namespace lemon { 00030 00033 00035 00042 00043 #ifdef DOXYGEN 00044 template <typename GR> 00045 #else 00046 template <typename GR> 00047 #endif 00048 class Bfs{ 00049 public: 00051 typedef GR Graph; 00053 typedef typename Graph::Node Node; 00055 typedef typename Graph::NodeIt NodeIt; 00057 typedef typename Graph::Edge Edge; 00059 typedef typename Graph::OutEdgeIt OutEdgeIt; 00060 00063 typedef typename Graph::template NodeMap<Edge> PredMap; 00066 typedef typename Graph::template NodeMap<Node> PredNodeMap; 00068 typedef typename Graph::template NodeMap<int> DistMap; 00069 00070 private: 00072 const Graph *G; 00074 PredMap *predecessor; 00076 bool local_predecessor; 00078 PredNodeMap *pred_node; 00080 bool local_pred_node; 00082 DistMap *distance; 00084 bool local_distance; 00085 00087 Node source; 00088 00089 00091 void init_maps() 00092 { 00093 if(!predecessor) { 00094 local_predecessor = true; 00095 predecessor = new PredMap(*G); 00096 } 00097 if(!pred_node) { 00098 local_pred_node = true; 00099 pred_node = new PredNodeMap(*G); 00100 } 00101 if(!distance) { 00102 local_distance = true; 00103 distance = new DistMap(*G); 00104 } 00105 } 00106 00107 public : 00109 00112 Bfs(const Graph& _G) : 00113 G(&_G), 00114 predecessor(NULL), local_predecessor(false), 00115 pred_node(NULL), local_pred_node(false), 00116 distance(NULL), local_distance(false) 00117 { } 00118 00120 ~Bfs() 00121 { 00122 if(local_predecessor) delete predecessor; 00123 if(local_pred_node) delete pred_node; 00124 if(local_distance) delete distance; 00125 } 00126 00128 00134 Bfs &setPredMap(PredMap &m) 00135 { 00136 if(local_predecessor) { 00137 delete predecessor; 00138 local_predecessor=false; 00139 } 00140 predecessor = &m; 00141 return *this; 00142 } 00143 00145 00151 Bfs &setPredNodeMap(PredNodeMap &m) 00152 { 00153 if(local_pred_node) { 00154 delete pred_node; 00155 local_pred_node=false; 00156 } 00157 pred_node = &m; 00158 return *this; 00159 } 00160 00162 00168 Bfs &setDistMap(DistMap &m) 00169 { 00170 if(local_distance) { 00171 delete distance; 00172 local_distance=false; 00173 } 00174 distance = &m; 00175 return *this; 00176 } 00177 00179 00186 00187 void run(Node s) { 00188 00189 init_maps(); 00190 00191 source = s; 00192 00193 for ( NodeIt u(*G) ; u!=INVALID ; ++u ) { 00194 predecessor->set(u,INVALID); 00195 pred_node->set(u,INVALID); 00196 } 00197 00198 int N=G->nodeNum(); 00199 std::vector<typename Graph::Node> Q(N); 00200 int Qh=0; 00201 int Qt=0; 00202 00203 Q[Qh++]=source; 00204 distance->set(s, 0); 00205 do { 00206 Node m; 00207 Node n=Q[Qt++]; 00208 int d= (*distance)[n]+1; 00209 00210 for(OutEdgeIt e(*G,n);e!=INVALID;++e) 00211 if((m=G->head(e))!=s && (*predecessor)[m]==INVALID) { 00212 Q[Qh++]=m; 00213 predecessor->set(m,e); 00214 pred_node->set(m,n); 00215 distance->set(m,d); 00216 } 00217 } while(Qt!=Qh); 00218 } 00219 00221 00226 int dist(Node v) const { return (*distance)[v]; } 00227 00229 00237 Edge pred(Node v) const { return (*predecessor)[v]; } 00238 00240 00247 Node predNode(Node v) const { return (*pred_node)[v]; } 00248 00250 00253 const DistMap &distMap() const { return *distance;} 00254 00256 00260 const PredMap &predMap() const { return *predecessor;} 00261 00263 00267 const PredNodeMap &predNodeMap() const { return *pred_node;} 00268 00270 00276 bool reached(Node v) { return v==source || (*predecessor)[v]!=INVALID; } 00277 00278 }; 00279 00281 00282 } //END OF NAMESPACE LEMON 00283 00284 #endif 00285 00286

Generated on Thu Sep 30 12:18:33 2004 for LEMON by doxygen 1.3.8