// Copyright 2017, University of Freiburg, // Chair of Algorithms and Data Structures. // Authors: Patrick Brosi #ifndef UTIL_GRAPH_EDIJKSTRA_H_ #define UTIL_GRAPH_EDIJKSTRA_H_ #include #include #include #include #include #include "util/graph/Edge.h" #include "util/graph/Graph.h" #include "util/graph/Node.h" #include "util/graph/ShortestPath.h" namespace util { namespace graph { using util::graph::Graph; using util::graph::Node; using util::graph::Edge; // edge-based dijkstra - settles edges instead of nodes class EDijkstra : public ShortestPath { public: template struct RouteEdge { RouteEdge() : e(0), parent(0), d(), h(), n(0) {} RouteEdge(Edge* e) : e(e), parent(0), d(), h(), n(0) {} RouteEdge(Edge* e, Edge* parent, Node* n, C d) : e(e), parent(parent), d(d), h(), n(n) {} RouteEdge(Edge* e, Edge* parent, Node* n, C d, C h) : e(e), parent(parent), d(d), h(h), n(n) {} Edge* e; Edge* parent; C d; C h; Node* n; bool operator<(const RouteEdge& p) const { return h > p.h || (h == p.h && d > p.d); } }; template struct CostFunc : public ShortestPath::CostFunc { C operator()(const Node* from, const Edge* e, const Node* to) const { UNUSED(from); UNUSED(e); UNUSED(to); return C(); }; }; template struct HeurFunc : public ShortestPath::HeurFunc { C operator()(const Node* from, const std::set*>& to) const { UNUSED(from); UNUSED(to); return C(); }; }; template using Settled = std::unordered_map*, RouteEdge >; template using PQ = std::priority_queue >; template static C shortestPathImpl(const std::set*> from, const std::set*>& to, const ShortestPath::CostFunc& costFunc, const ShortestPath::HeurFunc& heurFunc, EList* resEdges, NList* resNodes); template static C shortestPathImpl(Node* from, const std::set*>& to, const ShortestPath::CostFunc& costFunc, const ShortestPath::HeurFunc& heurFunc, EList* resEdges, NList* resNodes); template static C shortestPathImpl(Edge* from, const std::set*>& to, const ShortestPath::CostFunc& costFunc, const ShortestPath::HeurFunc& heurFunc, EList* resEdges, NList* resNodes); template static C shortestPathImpl(const std::set*>& from, const std::set*>& to, const ShortestPath::CostFunc& costFunc, const ShortestPath::HeurFunc& heurFunc, EList* resEdges, NList* resNodes); template static std::unordered_map*, C> shortestPathImpl( const std::set*>& from, const ShortestPath::CostFunc& costFunc, bool rev); template static std::unordered_map*, C> shortestPathImpl( Edge* from, const std::set*>& to, const ShortestPath::CostFunc& costFunc, const ShortestPath::HeurFunc& heurFunc, std::unordered_map*, EList*> resEdges, std::unordered_map*, NList*> resNodes); template static void buildPath(Edge* curE, const Settled& settled, NList* resNodes, EList* resEdges); template static inline void relax(RouteEdge& cur, const std::set*>& to, const ShortestPath::CostFunc& costFunc, const ShortestPath::HeurFunc& heurFunc, PQ& pq); template static void relaxInv(RouteEdge& cur, const ShortestPath::CostFunc& costFunc, PQ& pq); static size_t ITERS; }; #include "util/graph/EDijkstra.tpp" } } #endif // UTIL_GRAPH_DIJKSTRA_H_