Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vi p; // Vector del representante de cada nodo (p[i] es el representante de i)
- // Dado un nodo nos devuelve su representante y a la vez hacemos una compresión de caminos
- int findSet(int i) {
- if (p[i] != i) p[i] = findSet(p[i]); //buscamos el representante de la componente
- return p[i];
- }
- // Dados el número de nodos del grafo (n), y el conjunto de aristas (edges) donde edge[i] =
- // {peso del arco, nodo, nodo}, devuelve el coste del mínimo árbol generador.
- int Kruskal(int n, vector <vi>& edges) {
- sort(edges.begin(), edges.end()); // Ordenamos de menor a mayor los arcos según su peso
- p = vi(n);
- for (int i = 0; i < n; ++i) p[i] = i; // el representante de cada nodo es él mismo
- int answer = 0; // variable donde acumulamos los pesos de los arcos que cogemos
- for (int i = 0; i < edges.size(); ++i){
- vi arc = edges[i];
- int u = arc[2];
- int v = arc[1];
- int w = arc[0];
- int pu = findSet(u); // representante del nodo u
- int pv = findSet(v); // representante del nodo v
- if (pu != pv){ // si no tienen el mismo representante, u y v forman parte de
- // componentes conexas distintas, por lo que cogemos el arco
- answer += w;
- p[pu] = pv; // actualizamos representantes
- }
- }
- return answer;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement