bellman_ford.h

00001 //==========================================================================
00002 //
00003 //   bellman_ford.h
00004 //
00005 //==========================================================================
00006 // $Id: bellman_ford.h,v 1.5 2003/03/24 15:58:54 raitner Exp $ 
00007 
00008 #ifndef GTL_BELLMAN_FORD_H
00009 #define GTL_BELLMAN_FORD_H
00010 
00011 #include <GTL/GTL.h>
00012 #include <GTL/algorithm.h>
00013 #include <GTL/node_map.h>
00014 #include <GTL/edge_map.h>
00015 
00016 __GTL_BEGIN_NAMESPACE
00017 
00018 
00032 class GTL_EXTERN bellman_ford : public algorithm 
00033 {
00034 public:
00035 
00039     bellman_ford();
00040 
00044     virtual ~bellman_ford();
00045 
00057     int check (graph& G);
00058 
00059     int run (graph& G);
00060 
00067     void reset ();
00068 
00078     void source (const node& n) {s = n;}    
00079 
00085     node source () const {return s;}
00086 
00094     void weights (const edge_map<double>& weight) {w = weight; vars_set = true; }
00095     
00106     void store_preds (bool set);
00107 
00116     bool store_preds () const {return preds != 0;}
00117 
00123     bool reached (const node& n) const {return !inf[n];}
00124 
00130     double distance (const node& n) const {return d[n];}
00131 
00146     edge predecessor_edge (const node& n) const
00147         {assert (preds); return (*preds)[n];}
00148 
00163     node predecessor_node (const node& n) const
00164         {edge e = predecessor_edge(n); return e == edge() ? node() : e.opposite(n); }
00165 
00170     bool negative_cycle() const
00171         {return cycle;}
00172 
00173 private:
00174 
00175     
00181     void relax (const edge& e, bool dir);
00182 
00188     node s;
00189 
00195     edge_map<double> w;
00196     
00202     bool vars_set; 
00203 
00209     node_map<double> d; 
00210 
00216     node_map<bool> inf;
00217 
00223     node_map<edge>* preds;
00224 
00231     bool cycle; 
00232 };
00233 
00234 __GTL_END_NAMESPACE
00235 
00236 #endif // GTL_BELLMAN_FORD_H