public:
void run(const Vertex& s) { // run Dijkstra's alg
VertexIterator vertices = graph.vertices();
while (vertices.hasNext()) { // initialize vertices
Vertex u = vertices.nextVertex();
int u_dist = INFINITE; // distance = infinity
if (u == s) u_dist = 0; // ...except source
setDist(u, u_dist);
Locator u_loc = Q.insertItem(u_dist, u); // put vertex into Q
setLoc(u, u_loc); // save its locator
}
while (!Q.isEmpty()) { // main processing loop
Locator u_loc = Q.min(); // get closest vertex
Vertex u = getVertex(u_loc);
int u_dist = getDist(u_loc); // ...and its distance
Q.remove(u_loc); // remove it from Q
setDist(u, u_dist); // set final distance
destroyLoc(u); // remove the locator
if (u_dist == INFINITE) continue; // ignore if unreachable
EdgeIterator edges = graph.incidentEdges(u);
while (edges.hasNext()) { // visit u's neighbors
Edge e = edges.nextEdge();
Vertex z = graph.opposite(u,e);
if (hasLoc(z)) { // if z is not finished
int e_weight = weight(e); // get edge weight
Locator z_loc = getLoc(z);
int z_dist = getDist(z_loc); // get distance to z
if (u_dist + e_weight < z_dist) // relaxation of (u,z)
Q.replaceKey(z_loc, u_dist + e_weight);
}
}
}
}