Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define WHITE 10
- #define BLACK 9
- using namespace std;
- class DisjointSet {
- public:
- DisjointSet(int num_nodes);
- int parent(int element);
- void do_union(int element_a, int element_b);
- private:
- std::vector<int> parent_;
- std::vector<int> rank_;
- };
- DisjointSet::DisjointSet(int num_nodes):parent_(num_nodes),rank_(num_nodes, 0){
- for(int i=0; i<num_nodes; ++i) parent_[i] = i;
- }
- int DisjointSet::parent(int element){
- if(parent_[element] == element) return element;
- //1)path compression
- return (parent_[element] = parent(parent_[element]));
- }
- void DisjointSet::do_union(int a, int b){
- if(parent_[a] == parent_[b]) return;
- int fa = parent(a), fb = parent(b);
- //2)union by rank
- if(rank_[fa] < rank_[fb]) {
- parent_[fa] = fb;
- } else {
- parent_[fb] = fa;
- if(rank_[fa] == rank_[fb])
- rank_[fa]++;
- }
- }
- typedef pair< int, int > pi;
- int main(){
- int casos, n;
- vector<pair<double,double>> pintas_coord;
- vector<pair<double,pi>> arestas; //arestas grafo original
- vector<pair<double,pi>> min_tree; //arestas arvore minima
- double x,y, x2, y2;
- scanf("%d", &casos);
- while(casos--){
- pintas_coord.clear();
- arestas.clear();
- min_tree.clear();
- arestas.reserve(n*n);
- min_tree.reserve(n*n);
- scanf("%d", &n);
- for(int i=0; i<n;i++){
- scanf("%lf %lf", &x, &y);
- pintas_coord.push_back(make_pair(x,y));
- }
- //criando arestas
- for(int i=0; i<n; i++){
- for(int j=i+1; j<n; j++){
- x=pintas_coord[i].first; y=pintas_coord[i].second;
- x2=pintas_coord[j].first; y2=pintas_coord[j].second;
- double peso = sqrt(pow(x - x2, 2) + pow(y - y2, 2));
- arestas.push_back( make_pair( peso, make_pair(i, j)) );
- }
- }
- /**********************KRUSKAL*****************/
- double total_lenght=0;
- sort(arestas.begin(), arestas.end());
- DisjointSet ds(n);
- for(auto &aresta: arestas){
- int u = aresta.second.first;
- int v = aresta.second.second;
- int set_u = ds.parent(u);
- int set_v = ds.parent(v);
- if(set_u != set_v){
- min_tree.push_back( make_pair(aresta.first, make_pair(u,v)) );
- total_lenght += aresta.first;
- ds.do_union(set_u, set_v);
- }
- }
- printf("%.2lf", total_lenght);
- if(casos>0)
- printf("\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement