Advertisement
GastonFontenla

Kruskal

Jun 5th, 2017
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. struct Arista
  8. {
  9.     int desde;
  10.     int hacia;
  11.     int costo;
  12. };
  13.  
  14. bool comparador(const Arista &ar1, const Arista &ar2)
  15. {
  16.     return (ar1.costo < ar2.costo);
  17. }
  18.  
  19. Arista armarArista(int a, int b, int costo)
  20. {
  21.     Arista ar;
  22.     ar.desde = a;
  23.     ar.hacia = b;
  24.     ar.costo = costo;
  25.     return ar;
  26. }
  27.  
  28. struct Grafo
  29. {
  30.     vector <vector <Arista> > adj; ///Lista de adyacencia
  31.     vector <Arista> listaAristas; ///Acá se guardan todas las aristas
  32.     vector <int> idComp; ///Acá va el ID de la componente a la cual pertenece un nodo
  33.     vector <vector <int> > comp; ///Lista de nodos por cada componente
  34.  
  35.     void leer()
  36.     {
  37.         int nodos, aristas;
  38.         cin >> nodos >> aristas;
  39.  
  40.         adj.resize(nodos+1);
  41.         idComp.resize(nodos+1);
  42.         comp.resize(nodos+1);
  43.  
  44.         for(int i=1; i<=nodos; i++)
  45.         {
  46.             idComp[i] = i;
  47.             comp[i].push_back(i);
  48.         }
  49.  
  50.         int desde, hacia, costo;
  51.  
  52.         for(int i=0; i<aristas; i++)
  53.         {
  54.             cin >> desde >> hacia >> costo;
  55.             adj[desde].push_back(armarArista(desde, hacia, costo));
  56.             adj[hacia].push_back(armarArista(hacia, desde, costo));
  57.             listaAristas.push_back(armarArista(desde, hacia, costo));
  58.         }
  59.     }
  60.  
  61.     bool sigueSiendoArbol(Arista ar)
  62.     {
  63.         ///Preguntar si las componentes son distintas
  64.         int n1 = ar.desde;
  65.         int n2 = ar.hacia;
  66.  
  67.         int c1 = idComp[n1];
  68.         int c2 = idComp[n2];
  69.  
  70.         return (c1 != c2);
  71.     }
  72.  
  73.     void agregarArista(Arista ar)
  74.     {
  75.         ///1) Unificar los ID
  76.  
  77.         int n1 = ar.desde;
  78.         int n2 = ar.hacia;
  79.  
  80.         int c1 = idComp[n1];
  81.         int c2 = idComp[n2];
  82.  
  83.         int t1 = comp[c1].size();
  84.         int t2 = comp[c2].size();
  85.  
  86.         ///Siempre la componente 1 sea menor que la componente 2
  87.  
  88.         ///O(N*N) -> O(N*log(N))
  89.         if(t1 > t2) ///ES VITAL PARA QUE ESTO FUNCIONE COMO LA GENTE
  90.         {
  91.             swap(n1, n2);
  92.             swap(c1, c2);
  93.             swap(t1, t2);
  94.         }
  95.  
  96.         for(int i=0; i<t1; i++)
  97.         {
  98.             int n = comp[c1][i];
  99.             ///Cambiar el ID
  100.             ///Agregarlo a la lista de nodos de la otra componente
  101.             idComp[n] = c2;
  102.             comp[c2].push_back(n);
  103.         }
  104.     }
  105.  
  106.     void mostrarArista(Arista ar)
  107.     {
  108.         cout << "(" << ar.desde << ", " << ar.hacia << "): " << ar.costo << endl;
  109.     }
  110.  
  111.     void Kruskal()
  112.     {
  113.         ///ordenar la lista de arista
  114.         sort(listaAristas.begin(), listaAristas.end(), comparador);
  115.  
  116.         ///Agarrar una por una, ir agregándola a un MST(minimum spanning tree)
  117.         for(int i=0; i<listaAristas.size(); i++)
  118.         {
  119.             ///Agregar una arista, solamente si al agregarla no se forman ciclos
  120.             if(sigueSiendoArbol(listaAristas[i]))
  121.             {
  122.                 agregarArista(listaAristas[i]);
  123.                 mostrarArista(listaAristas[i]);
  124.             }
  125.         }
  126.     }
  127. };
  128.  
  129. int main()
  130. {
  131.     Grafo g;
  132.     g.leer();
  133.     g.Kruskal();
  134.  
  135.     return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement