00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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 }
00283
00284
#endif
00285
00286