Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. vi p; // Vector del representante de cada nodo (p[i] es el representante de i)
  2.  
  3. // Dado un nodo nos devuelve su representante y a la vez hacemos una compresión de caminos
  4. int findSet(int i) {
  5. if (p[i] != i) p[i] = findSet(p[i]); //buscamos el representante de la componente
  6. return p[i];
  7. }
  8.  
  9. // Dados el número de nodos del grafo (n), y el conjunto de aristas (edges) donde edge[i] =
  10. // {peso del arco, nodo, nodo}, devuelve el coste del mínimo árbol generador.
  11. int Kruskal(int n, vector <vi>& edges) {
  12. sort(edges.begin(), edges.end()); // Ordenamos de menor a mayor los arcos según su peso
  13.  
  14. p = vi(n);
  15. for (int i = 0; i < n; ++i) p[i] = i; // el representante de cada nodo es él mismo
  16. int answer = 0; // variable donde acumulamos los pesos de los arcos que cogemos
  17.  
  18. for (int i = 0; i < edges.size(); ++i){
  19. vi arc = edges[i];
  20.  
  21. int u = arc[2];
  22. int v = arc[1];
  23. int w = arc[0];
  24.  
  25. int pu = findSet(u); // representante del nodo u
  26. int pv = findSet(v); // representante del nodo v
  27.  
  28. if (pu != pv){ // si no tienen el mismo representante, u y v forman parte de
  29. // componentes conexas distintas, por lo que cogemos el arco
  30. answer += w;
  31. p[pu] = pv; // actualizamos representantes
  32. }
  33. }
  34.  
  35. return answer;
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement