int main(){ PriorityQueue* pr = new PriorityQueue(); pr->insertElem(4,13); pr->insertElem(3,5); pr->insertElem(2,9); pr->insertElem(1,2); for(int i=0 ; i<pr->size() ;i++){ printf("%d\n", pr->minQueue[i]->priority ); } if( pr->contains(4) ) { pr->changePriority(4,1); } while(!pr->isEmpty()){ Element * elem = pr->minPriority(); printf("(%d,%d)\n",elem->vertex,elem->priority); } }
// Return a list<char> containing the list of nodes in the shortest path between 'u' and 'w' list<char> ShortestPath::path(char u, char w) { // Initialize candidates list with all nodes list<char> candidates = graph.vertices(), desiredPath; list<NodeInfo> minPaths; PriorityQueue p; NodeInfo lastSelected, n; // Calculate shortest path from 'u' to 'w' (Dijkstra's Algorithm) candidates.remove(u); // Remove 'u' from candidates list lastSelected.nodeName = u; // Set 'u' as lastSelected lastSelected.minDist = 0; lastSelected.through = u; minPaths.push_back(lastSelected); // Add 'u' to minPath list while ((!candidates.empty()) && (lastSelected.nodeName !=w)) { // For each node in candidate list calculate the cost to reach that candidate through lastSelected for(list<char>::iterator i=candidates.begin(); i != candidates.end(); ++i) { n.nodeName=*i; n.minDist=lastSelected.minDist+graph.get_edge_value(lastSelected.nodeName,*i); n.through=lastSelected.nodeName; if (!p.contains(n)) // Add candidate to priority queue if doesn't exist p.insert(n); else if (p.isBetter(n)) // Update candidate minDist in priority queue if a better path was found p.chgPriority(n); } lastSelected = p.top(); // Select the candidate with minDist from priority queue p.minPriority(); // Remove it from the priority queue minPaths.push_back(lastSelected); // Add the candidate with min distance to minPath list candidates.remove(lastSelected.nodeName); // Remove it from candidates list } // Go backward from 'w' to 'u' adding nodes in that path to desiredPath list lastSelected=minPaths.back(); desiredPath.push_front(lastSelected.nodeName); while(lastSelected.nodeName!=u) { for(list<NodeInfo>::iterator i=minPaths.begin(); i != minPaths.end(); ++i) if ((*i).nodeName==lastSelected.through) { lastSelected=(*i); desiredPath.push_front(lastSelected.nodeName); } } return desiredPath; }