mcf.h

Go to the documentation of this file.
00001 
00003 #ifndef MCF_H
00004 #define MCF_H
00005 
00006 #include "linkgraph.h"
00007 #include <vector>
00008 
00014 class DistanceAnnotation : public Path {
00015 public:
00016 
00017   DistanceAnnotation(NodeID n, bool source = false) : Path(n, source) {}
00018 
00019   bool IsBetter(const DistanceAnnotation *base, uint cap, int free_cap, uint dist) const;
00020 
00025   inline uint GetAnnotation() const { return this->distance; }
00026 
00027   struct Comparator {
00028     bool operator()(const DistanceAnnotation *x, const DistanceAnnotation *y) const;
00029   };
00030 };
00031 
00038 class CapacityAnnotation : public Path {
00039 public:
00040 
00041   CapacityAnnotation(NodeID n, bool source = false) : Path(n, source) {}
00042 
00043   bool IsBetter(const CapacityAnnotation *base, uint cap, int free_cap, uint dist) const;
00044 
00049   inline int GetAnnotation() const { return this->GetCapacityRatio(); }
00050 
00051   struct Comparator {
00052     bool operator()(const CapacityAnnotation *x, const CapacityAnnotation *y) const;
00053   };
00054 };
00055 
00056 
00057 typedef std::vector<Path *> PathVector;
00058 
00062 class MultiCommodityFlow {
00063 protected:
00064   MultiCommodityFlow(LinkGraphComponent *graph) : graph(graph) {}
00065 
00066   template<class Tannotation> void Dijkstra(NodeID from, PathVector &paths, bool create_new_paths);
00067 
00068   uint PushFlow(Edge &edge, Path *path, uint accuracy, bool positive_cap);
00069 
00070   void CleanupPaths(NodeID source, PathVector &paths);
00071 
00072   LinkGraphComponent *graph; 
00073 };
00074 
00090 class MCF1stPass : public MultiCommodityFlow {
00091 private:
00092   bool EliminateCycles();
00093   bool EliminateCycles(PathVector &path, NodeID origin_id, NodeID next_id);
00094   void EliminateCycle(PathVector &path, Path *cycle_begin, uint flow);
00095   uint FindCycleFlow(const PathVector &path, const Path *cycle_begin);
00096 public:
00097   MCF1stPass(LinkGraphComponent *graph);
00098 };
00099 
00107 class MCF2ndPass : public MultiCommodityFlow {
00108 public:
00109   MCF2ndPass(LinkGraphComponent *graph);
00110 };
00111 
00116 template<class Tpass>
00117 class MCFHandler : public ComponentHandler {
00118 public:
00119 
00124   virtual void Run(LinkGraphComponent *graph) { Tpass pass(graph); }
00125 
00126   virtual ~MCFHandler() {}
00127 };
00128 
00129 #endif /* MCF_H */