GastonFontenla

Prim

Jun 3rd, 2018
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <queue>
  5.  
  6. using namespace std;
  7.  
  8. struct arista
  9. {
  10.     int desde, hacia, costo;
  11. };
  12.  
  13. bool operator<(const arista &a, const arista &b)
  14. {
  15.     return a.costo > b.costo;
  16. }
  17.  
  18. vector <vector <arista> > ady;
  19.  
  20. vector <arista> Prim(int cantNodos)
  21. {
  22.     vector <arista> arbol;
  23.     vector <bool> enArbol(cantNodos+1, false);
  24.     priority_queue <arista> pq;
  25.  
  26.     ///Meto las aristas del nodo 1
  27.     for(int i=0; i<ady[1].size(); i++)
  28.         pq.push(ady[1][i]);
  29.  
  30.     enArbol[1] = true;
  31.  
  32.     while(arbol.size() < cantNodos-1)
  33.     {
  34.         arista a = pq.top();
  35.         pq.pop();
  36.  
  37.         if(enArbol[a.hacia] == true) ///Evito formación de ciclos
  38.             continue;
  39.  
  40.         ///a.desde ya forma parte del arbol,
  41.         ///porque si así no lo fuera, sería imposible
  42.         ///que procecemos esta arista
  43.  
  44.         int nodo = a.hacia;
  45.         enArbol[a.hacia] = true;
  46.         arbol.push_back(a);
  47.  
  48.  
  49.         for(int i=0; i<ady[nodo].size(); i++)
  50.         {
  51.             int vecino = ady[nodo][i].hacia;
  52.             if(enArbol[vecino] == false)
  53.                 pq.push(ady[nodo][i]);
  54.         }
  55.     }
  56.  
  57.     return arbol;
  58. }
  59.  
  60. int main()
  61. {
  62.     int cantNodos, cantAristas;
  63.     cin >> cantNodos >> cantAristas;
  64.  
  65.     ady.resize(cantNodos+1);
  66.  
  67.     for(int i=0; i<cantAristas; i++)
  68.     {
  69.         int desde, hacia, costo;
  70.         cin >> desde >> hacia >> costo;
  71.         ady[desde].push_back({desde, hacia, costo});
  72.         ady[hacia].push_back({hacia, desde, costo});
  73.     }
  74.  
  75.     vector <arista> resultado = Prim(cantNodos);
  76.  
  77.     int costoTotal = 0;
  78.  
  79.     cout << "El arbol cubridor minimo es: " << endl;
  80.  
  81.     for(int i=0; i<resultado.size(); i++)
  82.     {
  83.         cout << "(" << resultado[i].desde << ",";
  84.         cout << resultado[i].hacia << ") -> " << resultado[i].costo << endl;
  85.         costoTotal += resultado[i].costo;
  86.     }
  87.  
  88.     cout << "El costo total es: " << costoTotal << endl;
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment