# include # include "string.C" # include "table.h" # include "labeledVertex.h" # include "labeledVertex.c" typedef labeledVertex node; typedef cAssociation &> arc; void dijkstra(node & start, dictionary & distances) { // make sure distances dictionary is empty distances.deleteAllValues(); // process a priority queue of distances to nodes priorityQueueList que; que.add(arc(0.0, start)); // continually remove smallest element from queue while (! que.isEmpty()) { arc neighbor = que.deleteMin(); node & neighborNode = neighbor.value(); // if neighbor has not already been seen, // process it if (! distances.includesKey(neighborNode)) { double dist = neighbor.key(); distances[neighborNode] = dist; dictionaryIterator itr(neighborNode.arcs); for (itr.init(); ! itr; itr++) { que.add(arc(dist + itr().value(), itr().key())); } } } } main() { // make the initial vertices labeledVertex pendleton("pendleton"); labeledVertex pensacola("pensacola"); labeledVertex peoria("peoria"); labeledVertex phoenix("phoenix"); labeledVertex pierre("pierre"); labeledVertex pittsburg("pittsburg"); labeledVertex princeton("princeton"); labeledVertex pueblo("pueblo"); // create the initial links pendleton.addArc(phoenix, 4); pendleton.addArc(pueblo, 8); pensacola.addArc(phoenix, 5); peoria.addArc(pittsburg, 5); peoria.addArc(pueblo, 3); phoenix.addArc(peoria, 4); phoenix.addArc(pittsburg, 10); phoenix.addArc(pueblo,3); pierre.addArc(pendleton, 2); pittsburg.addArc(pensacola, 4); princeton.addArc(pittsburg, 2); pueblo.addArc(pierre, 3); dictionary dist; dijkstra(pierre, dist); dictionaryIterator itr(dist); for (itr.init(); ! itr; itr++) cout << itr().key().value << " : " << itr().value() << '\n'; }