Advertisement
Guest User

Untitled

a guest
May 20th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define WHITE 10
  4. #define BLACK 9
  5.  
  6.  
  7. using namespace std;
  8.  
  9.  
  10.  
  11. class DisjointSet {
  12. public:
  13. DisjointSet(int num_nodes);
  14. int parent(int element);
  15. void do_union(int element_a, int element_b);
  16. private:
  17. std::vector<int> parent_;
  18. std::vector<int> rank_;
  19. };
  20.  
  21. DisjointSet::DisjointSet(int num_nodes):parent_(num_nodes),rank_(num_nodes, 0){
  22. for(int i=0; i<num_nodes; ++i) parent_[i] = i;
  23. }
  24.  
  25. int DisjointSet::parent(int element){
  26. if(parent_[element] == element) return element;
  27. //1)path compression
  28. return (parent_[element] = parent(parent_[element]));
  29. }
  30.  
  31. void DisjointSet::do_union(int a, int b){
  32. if(parent_[a] == parent_[b]) return;
  33. int fa = parent(a), fb = parent(b);
  34. //2)union by rank
  35. if(rank_[fa] < rank_[fb]) {
  36. parent_[fa] = fb;
  37. } else {
  38. parent_[fb] = fa;
  39. if(rank_[fa] == rank_[fb])
  40. rank_[fa]++;
  41. }
  42. }
  43.  
  44.  
  45. typedef pair< int, int > pi;
  46.  
  47. int main(){
  48.  
  49. int casos, n;
  50. vector<pair<double,double>> pintas_coord;
  51. vector<pair<double,pi>> arestas; //arestas grafo original
  52. vector<pair<double,pi>> min_tree; //arestas arvore minima
  53.  
  54.  
  55.  
  56. double x,y, x2, y2;
  57.  
  58.  
  59. scanf("%d", &casos);
  60.  
  61. while(casos--){
  62. pintas_coord.clear();
  63. arestas.clear();
  64. min_tree.clear();
  65. arestas.reserve(n*n);
  66. min_tree.reserve(n*n);
  67.  
  68. scanf("%d", &n);
  69. for(int i=0; i<n;i++){
  70. scanf("%lf %lf", &x, &y);
  71. pintas_coord.push_back(make_pair(x,y));
  72. }
  73.  
  74.  
  75. //criando arestas
  76. for(int i=0; i<n; i++){
  77. for(int j=i+1; j<n; j++){
  78. x=pintas_coord[i].first; y=pintas_coord[i].second;
  79. x2=pintas_coord[j].first; y2=pintas_coord[j].second;
  80.  
  81. double peso = sqrt(pow(x - x2, 2) + pow(y - y2, 2));
  82. arestas.push_back( make_pair( peso, make_pair(i, j)) );
  83. }
  84. }
  85.  
  86. /**********************KRUSKAL*****************/
  87. double total_lenght=0;
  88.  
  89. sort(arestas.begin(), arestas.end());
  90. DisjointSet ds(n);
  91.  
  92. for(auto &aresta: arestas){
  93. int u = aresta.second.first;
  94. int v = aresta.second.second;
  95.  
  96. int set_u = ds.parent(u);
  97. int set_v = ds.parent(v);
  98.  
  99. if(set_u != set_v){
  100. min_tree.push_back( make_pair(aresta.first, make_pair(u,v)) );
  101. total_lenght += aresta.first;
  102. ds.do_union(set_u, set_v);
  103. }
  104.  
  105. }
  106.  
  107. printf("%.2lf", total_lenght);
  108. if(casos>0)
  109. printf("\n");
  110.  
  111.  
  112. }
  113.  
  114.  
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement