Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include<math.h>
  5. #include<fstream>
  6.  
  7. using namespace std;
  8.  
  9. ifstream archivo;
  10. ofstream out("parque.out");
  11.  
  12. vector <int> idComponente;
  13. vector <vector <int> > componente;
  14. unsigned long long int costoTotal=0;
  15. vector<pair<int,int>>vec;
  16.  
  17.  
  18.  
  19. bool unionFind(int nodoA, int nodoB){
  20. int compA = idComponente[nodoA];
  21. int compB = idComponente[nodoB];
  22.  
  23. if(compA == compB){
  24. return false;
  25. }
  26. int tamA = componente[compA].size();
  27. int tamB = componente[compB].size();
  28.  
  29. if(tamA > tamB){
  30. swap(compA, compB);
  31. swap(tamA, tamB);
  32. }
  33.  
  34. for(int i=0; i<tamA; i++){
  35. int nodo = componente[compA][i];
  36. componente[compB].push_back(nodo);
  37. idComponente[nodo] = compB;
  38. }
  39.  
  40. return true;
  41. }
  42.  
  43.  
  44. struct arista
  45. {
  46. int desde, hacia, costo;
  47. float hipo;
  48. };
  49.  
  50. bool ordenar(arista a,arista b)
  51. {
  52. return (a.hipo < b.hipo);
  53. }
  54.  
  55. struct gg{
  56. int nodo,px,py;
  57. };
  58.  
  59.  
  60.  
  61.  
  62. vector <arista> kruskal(vector <arista> a, int cantNodos){
  63.  
  64. idComponente.resize(cantNodos);
  65. componente.resize(cantNodos);
  66. for(int i=0; i<cantNodos; i++){
  67. idComponente[i] = i;
  68. componente[i] = vector <int> (1, i);
  69. }
  70.  
  71. vector <arista> arbol;
  72. sort(a.begin(), a.end(),ordenar);
  73.  
  74. for(int i=0;i<a.size() && arbol.size()<cantNodos-1; i++){
  75. if(unionFind(a[i].desde, a[i].hacia)){
  76. arbol.push_back(a[i]);
  77. costoTotal+=a[i].costo;
  78. }
  79. }
  80. out<<costoTotal<<endl;
  81. ////////////////////////////
  82. return arbol;
  83. }
  84.  
  85.  
  86. float hipotenusa(pair<int,int>a,pair<int,int>b){
  87. float max1,max2,min1,min2;
  88. max1=max(a.first,b.first);
  89. min1=min(a.first,b.first);
  90. max2=max(a.second,b.second);
  91. min2=min(a.second,b.second);
  92. float terminoA=(max1-min1)*(max1-min1);
  93. float terminoB=(max2-min2)*(max2-min2);
  94. float hip2=sqrt(terminoA+terminoB);
  95. return(hip2);
  96. }
  97.  
  98.  
  99. int chicote(float hip){
  100. int aux=hip;
  101. float decimal=hip-aux;
  102. int cable2=(2-decimal)+hip;
  103. return cable2;
  104. }
  105.  
  106.  
  107.  
  108. int main()
  109. {
  110. archivo.open("parque.in",ios::in);
  111.  
  112.  
  113. int cantNodos,cantAristas;
  114. //
  115. archivo>>cantNodos;
  116. cantNodos++;
  117. ///////////////////////////////////////////////////////////
  118. cantAristas=(cantNodos*(cantNodos-1))/2;
  119.  
  120. vector <arista> a(cantAristas);
  121.  
  122.  
  123.  
  124.  
  125. vec.resize(cantNodos);
  126.  
  127. vec[0]={0,0};
  128. for(int i=1;i<cantNodos;i++){
  129. int nodo,x,y;
  130. ///////////////////////////////////////////
  131. archivo>>nodo>>x>>y;
  132. vec[nodo].first=x;
  133. vec[nodo].second=y;
  134. }
  135.  
  136.  
  137.  
  138. int contador=0;
  139. for(int i=0;i<vec.size()-1;i++){
  140. for(int j=i+1;j<vec.size();j++){
  141. float hip=hipotenusa(vec[i],vec[j]);
  142. int cable=chicote(hip);
  143. a[contador].hipo=hip;
  144. a[contador].desde=i;
  145. a[contador].hacia=j;
  146. a[contador].costo=cable;
  147. contador++;
  148. }
  149. }
  150. ///
  151.  
  152.  
  153.  
  154. vector <arista> resultado = kruskal(a, cantNodos);
  155. vector<vector<int> >conexiones(cantNodos);
  156.  
  157. for(int i=0; i<resultado.size(); i++){
  158. conexiones[ resultado[i].desde ].push_back(resultado[i].hacia);
  159. conexiones[resultado[i].hacia].push_back( resultado[i].desde );
  160. }
  161. for(int i=1;i<conexiones.size();i++){
  162. out<<i<<" ";
  163. ///////////////////////
  164. for(int j=0;j<conexiones[i].size();j++){
  165. out<<conexiones[i][j]<<" ";
  166. ///////////////////////
  167. }
  168. out<<endl;
  169. ///////////////////
  170. }
  171.  
  172.  
  173. return 0;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement