Advertisement
GastonFontenla

Dijkstra + lectura de grafos ponderados

May 26th, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. #define INF (1 << 29)
  8.  
  9. vector <vector <pair<int, int> > > ady; ///Lista de adyacencia de grafo ponderado
  10. int n; ///Cantidad de nodos
  11.  
  12. vector <int> Dijkstra(int inicio)
  13. {
  14.     vector <int> dist(n+1, INF);
  15.     priority_queue <pair<int, int> > pq;
  16.  
  17.     ///Para comenzar el algoritmo decimos que dist[inicio] es cero
  18.     ///Y ponemos el primer elemento junto con su distancia en la cola de prioridad
  19.  
  20.     dist[inicio] = 0;
  21.     pq.push({0, inicio});
  22.  
  23.     ///Nota: por convención nuestra, siempre que usemos par, el first es el costo o distancia
  24.     ///El second va a ser el nodo
  25.     ///Esta convención se usa en la lista de adyacencia y en la cola de prioridad, para que sean coherentes
  26.  
  27.     for(int i=0; i<n; i++)
  28.     {
  29.         ///pq.top() me devuelve el pair con mayor prioridad (o sea el mas grande)
  30.         ///http://www.cplusplus.com/reference/utility/pair/operators/
  31.         ///Nota: no es necesario incluir utility
  32.         int nodo = pq.top().second;
  33.         pq.pop();
  34.  
  35.         for(int j=0; j<ady[nodo].size(); j++)
  36.         {
  37.             int vecino = ady[nodo][j].second;
  38.             int costo = ady[nodo][j].first;
  39.  
  40.             if(dist[nodo] + costo < dist[vecino])
  41.             {
  42.                 ///dist[nodo] + costo representa:
  43.                 ///la menor distancia desde inicio hasta nodo + costo de nodo hasta vecino
  44.                 ///Si entré acá significa que esa distancia nueva es mejor que lo que había antes
  45.                 ///entonces actualizo la distancia, y pongo al vecino con su distancia en pq
  46.                 dist[vecino] = dist[nodo] + costo;
  47.                 pq.push({-dist[vecino], vecino});
  48.                 ///------^ Notar el signo menos antes de la distancia
  49.                 ///eso lo usamos para que la cola de prioridad nos ordene por "menor distancia"
  50.             }
  51.         }
  52.  
  53.         ///El for i solo necesita ir hasta n ya que cada vez que sacamos algo de la cola de prioridad
  54.         ///sabemos que su distancia ya es mínima, entonces como tenemos que procesar N nodos
  55.         ///necesitamos n extracciones de la PQ
  56.     }
  57.  
  58.     return dist; ///Devuelvo el vector con distancias calculadas. INF si no es posible llegar a X nodo
  59. }
  60.  
  61. void lecturaGrafoPonderado()
  62. {
  63.     ///Esto no lo vimos en clase pero es fácil uniendo conceptos y recordando
  64.     ///la lectura para grafos no ponderados
  65.  
  66.     int m;
  67.     cin >> n >> m; ///Leo nodos y aristas
  68.  
  69.     ady.resize(n+1);
  70.  
  71.     for(int i=0; i<m; i++)
  72.     {
  73.         int desde, hasta, costo;
  74.         cin >> desde >> hasta >> costo;
  75.         ady[desde].push_back({costo, hasta});
  76.         ady[hasta].push_back({costo, desde});
  77.     }
  78. }
  79.  
  80. int main()
  81. {
  82.     /**
  83.     Input:
  84.     6 7
  85.     1 2 5
  86.     1 4 9
  87.     1 5 2
  88.     2 3 2
  89.     3 4 3
  90.     4 6 2
  91.     5 6 3
  92.     1
  93.     **/
  94.  
  95.     lecturaGrafoPonderado();
  96.  
  97.     int nodoInicio;
  98.     cin >> nodoInicio;
  99.  
  100.     vector <int> distancias = Dijkstra(nodoInicio);
  101.  
  102.     cout << "Las distancias minimas desde " << nodoInicio << " son: " << endl;
  103.     for(int i=1; i<=n; i++)
  104.     {
  105.         cout << nodoInicio << " -> " << i << ": ";
  106.         if(distancias[i] == INF)
  107.              cout << "Imposible llegar" << endl;
  108.         else
  109.             cout << distancias[i] << endl;
  110.     }
  111.  
  112.     return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement