Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- struct arista
- {
- int desde, hasta, costo;
- };
- bool operator<(const arista &a, const arista &b)
- {
- return a.costo > b.costo;
- }
- vector <vector <arista> > ady;
- vector <int> id;
- vector <vector <int> > comp;
- bool unionfind(int a, int b)
- {
- int idA = id[a];
- int idB = id[b];
- if(idA == idB)
- return false;
- int tA = comp[idA].size();
- int tB = comp[idB].size();
- if(tB > tA)
- {
- swap(a, b);
- swap(idA, idB);
- swap(tA, tB);
- }
- for(int i=0; i<tB; i++)
- {
- comp[idA].push_back(comp[idB][i]);
- id[comp[idB][i]] = idA;
- }
- return true;
- }
- int main()
- {
- int n;
- cin >> n;
- ady.resize(n);
- comp.resize(n);
- id.resize(n);
- for(int i=0; i<n; i++)
- {
- comp[i].push_back(i);
- id[i] = i;
- }
- priority_queue <arista> pq;
- for(int i=0; i<n; i++)
- {
- for(int j=0; j<n; j++)
- {
- if(i != j)
- {
- ady[i].push_back({i, j, i^j});
- pq.push({i, j, i^j});
- }
- }
- }
- vector <arista> MST;
- while(pq.size())
- {
- arista ar = pq.top();
- pq.pop();
- if(unionfind(ar.desde, ar.hasta))
- MST.push_back(ar);
- }
- int sumaTotal = 0;
- map<int, int> mapa;
- for(int i=0; i<MST.size(); i++)
- {
- //cout << MST[i].desde << " a " << MST[i].hasta << " con " << MST[i].costo << endl;
- sumaTotal += MST[i].costo;
- mapa[MST[i].costo]++;
- }
- cout << "Costo total MST: " << sumaTotal << endl;
- for(auto i:mapa)
- {
- cout << i.first << ": " << i.second << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment