void RoadMap::visualizePath(list<uint> path){ this->resetMap(); uint stopNo = 1; list<uint>::const_iterator it = path.begin(); list<uint>::const_iterator ite = path.end(); Crossroad c = crossRoads.find(*it)->second; dijkstraShortestPath(c); //Set path source orange gv->setVertexColor(*it, "orange"); gv->setVertexSize(*it, 20); it++; while(it != ite){ //Sleep(1000); dijkstraShortestPath(c); Crossroad tmp = crossRoads.find(*it)->second; vector<Crossroad> subPath = getPath(c, tmp); stringstream ss; ss << "Paragem " << stopNo; for (uint i = 1; i < subPath.size()-1; ++i) { gv->setVertexColor(subPath[i].getId(), "yellow"); gv->setVertexSize(subPath[i].getId(), 10); } gv->setVertexColor(*it, "pink"); gv->setVertexSize(*it, 20); gv->setVertexLabel(*it, ss.str()); gv->rearrange(); c=tmp; stopNo++; it++; } //Set path destination red it--; gv->setVertexColor(*it, "red"); gv->setVertexLabel(*it, "Destino"); gv->rearrange(); }
bool RoadMap::insertNewDest(uint srcId, uint destId, list<uint> mustPass, list<uint> &path, list<double> &dist){ Crossroad src = crossRoads.find(srcId)->second; list<uint>::iterator next; dijkstraShortestPath(src); if(mustPass.empty()){ Crossroad dest = crossRoads.find(destId)->second; double minDist = getVertex(dest)->getDist(); dist.push_back(dist.back() + minDist); path.push_back(destId); } else{ double minDist = DBL_MAX; for (list<uint>::iterator it = mustPass.begin(); it != mustPass.end(); ++it) { Crossroad tmp = crossRoads.find(*it)->second; if(getVertex(tmp)->getDist() < minDist){ minDist = getVertex(tmp)->getDist(); next = it; } } dist.push_back(dist.back() + minDist); path.push_back(*next); mustPass.erase(next); insertNewDest(path.back(), destId, mustPass, path, dist); } return true; }
double RoadMap::getDist(uint srcId, uint destId){ Crossroad src = crossRoads.find(srcId)->second; Crossroad dest = crossRoads.find(destId)->second; dijkstraShortestPath(src); return getVertex(dest)->getDist(); }
void main(){ int matrix[5][5]={/* first node*/ {MAX_VALUE, 20, 70, MAX_VALUE, 50}, /* second node*/{20, MAX_VALUE, 15, 40, MAX_VALUE}, /* third node*/ {10, 15, MAX_VALUE, 70, MAX_VALUE}, /* fourth node*/{MAX_VALUE, 40, 70, MAX_VALUE, 16}, /* fifth node*/ {50, MAX_VALUE, MAX_VALUE, 16, MAX_VALUE} }; dijkstraShortestPath(matrix, 0, 5); }
int main(int argc, char *argv[]){ Graph *graph = NULL; int vertex, edges, end, start; scanf("%d %d", &vertex, &edges); graph = createGraph('L', 'D', vertex, edges); while((scanf("%d %d", &start, &end)) != EOF) dijkstraShortestPath(graph, start, end); freeGraph(&graph); return 0; }
void RoadMap::insertNewSrc(uint srcId, uint destId, uint newSrc, list<uint>&mustPass, list<uint> &path, list<double> &dist){ Crossroad src = crossRoads.find(srcId)->second; list<uint>::iterator next; dijkstraShortestPath(src); double minDist = DBL_MAX; for (list<uint>::iterator it = mustPass.begin(); it != mustPass.end(); ++it) { Crossroad tmp = crossRoads.find(*it)->second; if(getVertex(tmp)->getDist() < minDist){ minDist = getVertex(tmp)->getDist(); next = it; } } if(minDist == INT_INFINITY){ cout << "Impossible!!!!!" <<endl; return; } if(*next == newSrc){ dist.push_back(dist.back() + minDist); path.push_back(*next); mustPass.erase(next); } else{ dist.push_back(dist.back() + minDist); path.push_back(*next); mustPass.erase(next); insertNewSrc(path.back(), destId, newSrc, mustPass, path, dist); } }