GastonFontenla

Pepe

May 29th, 2018
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. vector <vector <pair<int, int> > > ady;
  8. #define INF (1 << 29)
  9.  
  10. vector <int> Dijkstra(int nodoInicio, int nodoFinal)
  11. {
  12.     vector <int> dist(ady.size(), INF);
  13.     priority_queue <pair<int, int> > pq;
  14.     vector <int> padres(ady.size(), -1);
  15.  
  16.     dist[nodoInicio] = 0;
  17.     pq.push({0, nodoInicio});
  18.  
  19.     for(int q=0; q<ady.size()-1; q++)
  20.     {
  21.         int nodo = pq.top().second;
  22.         pq.pop();
  23.  
  24.         for(int i=0; i<ady[nodo].size(); i++)
  25.         {
  26.             int vecino = ady[nodo][i].second;
  27.             int costo = ady[nodo][i].first;
  28.  
  29.             if(dist[vecino] > dist[nodo] + costo)
  30.             {
  31.                 dist[vecino] = dist[nodo] + costo;
  32.                 pq.push({-dist[vecino], vecino});
  33.                 padres[vecino] = nodo;
  34.             }
  35.         }
  36.     }
  37.  
  38.     ///backtracking
  39.     vector <int> camino;
  40.     camino.push_back(nodoFinal);
  41.  
  42.     while(nodoFinal != nodoInicio)
  43.     {
  44.         nodoFinal = padres[nodoFinal];
  45.         camino.push_back(nodoFinal);
  46.     }
  47.  
  48.     for(int i=0; i<camino.size()/2; i++)
  49.         swap(camino[i], camino[camino.size()-1-i]);
  50.  
  51.     return camino;
  52. }
  53.  
  54. int main()
  55. {
  56.     int n;
  57.     vector <int> camino = Dijkstra(1, 5);
  58.  
  59.     cout << "El camino recorrido es: ";
  60.     for(auto i:camino)
  61.         cout << i << " ";
  62.     cout << endl;
  63.  
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment