Advertisement
GastonFontenla

Dijkstra

Aug 11th, 2019
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. #define INF 1e9
  8.  
  9. struct arista
  10. {
  11.     int desde, hasta, costo;
  12. };
  13.  
  14. struct par
  15. {
  16.     int nodo, dist;
  17. };
  18.  
  19. bool operator<(const par &a, const par &b)
  20. {
  21.     ///Devolvemos si a.dist es mayor a b.dist
  22.     ///porque priority_queue nos devuelve siempre el máximo
  23.     ///entonces "hackeamos" la priority_queue
  24.     ///haciendo que ordene al revés
  25.     ///entonces siempre nos devolverá el mínimo
  26.     return a.dist > b.dist;
  27. }
  28.  
  29. vector <vector <arista> > ady;
  30. int cantNodos; ///Esta variable es más útil si es global
  31.  
  32. vector <int> Dijkstra(int origen)
  33. {
  34.     vector <int> dist(cantNodos, INF);
  35.     priority_queue <par> pq;
  36.     dist[origen] = 0;
  37.     pq.push({origen, 0});
  38.  
  39.     while(pq.size())
  40.     {
  41.         ///Saco el nodo con menor distancia
  42.         int nodo = pq.top().nodo;
  43.         pq.pop();
  44.  
  45.         ///Recorro los vecinos de nodo
  46.         for(const auto &ar:ady[nodo])
  47.         {
  48.             if(dist[nodo]+ar.costo < dist[ar.hasta])
  49.             {
  50.                 dist[ar.hasta] = dist[nodo]+ar.costo;
  51.                 pq.push({ar.hasta, dist[ar.hasta]});
  52.             }
  53.         }
  54.     }
  55.  
  56.     return dist;
  57. }
  58.  
  59. int main()
  60. {
  61.     int cantAristas, a, b, costo;
  62.     cin >> cantNodos >> cantAristas;
  63.  
  64.     ady.resize(cantNodos+1);
  65.  
  66.     for(int i=0; i<cantAristas; i++)
  67.     {
  68.         cin >> a >> b >> costo;
  69.         ady[a].push_back({a, b, costo});
  70.         ady[b].push_back({b, a, costo});
  71.     }
  72.  
  73.     vector <int> res = Dijkstra(1);
  74.  
  75.     cout << "Distancia desde el nodo 1 hacia los demas: " << endl;
  76.     for(int i=1; i<=cantNodos; i++)
  77.     {
  78.         cout << i << ": " << res[i] << endl;
  79.     }
  80.    
  81.     ///Ver este problema, es literal Dijkstra
  82.     ///https://www.spoj.com/problems/EZDIJKST/
  83.  
  84.     ///Ver este problema, es Dijkstra con un agregado
  85.     ///https://codeforces.com/problemset/problem/20/C
  86.     ///Pide reconstruir el camino mínimo desde el nodo 1 hasta el nodo n
  87.     ///Se puede lograr modificando un poco el código
  88.  
  89.     return 0;
  90. }
  91.  
  92. /**
  93. Ejemplo de input:
  94. 6 9
  95. 1 2 7
  96. 1 3 9
  97. 1 6 14
  98. 2 3 10
  99. 2 4 15
  100. 3 4 11
  101. 3 6 2
  102. 4 5 6
  103. 5 6 9
  104.  
  105. Output correcto:
  106. Distancia desde el nodo 1 hacia los demas:
  107. 1: 0
  108. 2: 7
  109. 3: 9
  110. 4: 20
  111. 5: 20
  112. 6: 11
  113.  
  114. **/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement