template <typename Graph> class Dijkstra { protected: // local types typedef typename Graph::Vertex Vertex; // ... (other graph types omitted) typedef PriorityQueue::Locator Locator; // ... (insert LocatorX here) enum { INFINITE = INT_MAX }; // infinite weight protected: // member data const Graph& graph; // the graph PriorityQueue Q; // the priority queue public: Dijkstra(const Graph& g) : graph(g) { } // constructor int getDist(const Vertex& u) const // final distance to u { return u.get("dist")->intValue(); } protected: // local utilities int weight(const Edge& e) const // get edge weight { return e.get("weight")->intValue(); } void setDist(const Vertex& v, int d) // set vertex distance { v.set("dist", new Integer(d)); } void setLoc(const Vertex& v, const Locator& loc) // set v's locator { v.set("loc", new LocatorX(loc)); } bool hasLoc(const Vertex& v) const // does v have locator? { return v.has("loc"); } Locator getLoc(const Vertex& v) const // get v's locator { return dynamic_cast<LocatorX*>(v.get("loc"))->getValue(); } void destroyLoc(const Vertex& v) { // remove locator attrib LocatorX* p = dynamic_cast<LocatorX*>(v.get("loc")); delete p; // delete locator object v.destroy("loc"); // delete attribute } Vertex getVertex(const Locator& loc) const // get locator vertex { return loc.element(); } int getDist(const Locator& loc) const // get vertex distance { return loc.key(); } // ... (insert run() here) };