Advertisement
Guest User

Untitled

a guest
Oct 21st, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.70 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <vector>
  3. #include <cmath>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. struct nodeUF
  9. {
  10. int parent; // koe e parent na temeto
  11. int tree_size; // koe e nivoto na drvoto vo koe sho se naogja ova teme
  12. };
  13.  
  14. struct rebroQ
  15. {
  16. int idx1; // pocetno teme
  17. int idx2; // krajno teme
  18. double weight; // tezina na rebroto
  19. };
  20.  
  21. class UF // UnionFind
  22. {
  23. vector<nodeUF> teminja; // nizata kade shto chuvame koe teme e parent na koe vo format teminja[a] = b, kade shto b e parent na a
  24. public:
  25. UF(int n)
  26. {
  27. for(int i = 0; i < n; i++)
  28. teminja.push_back({i, 1}); // na pochetokot gi inicijalizirame site teminja da se parent na sebesi
  29. }
  30.  
  31. inline bool is_connected(int id1, int id2) // proveri dali dve teminja se vo ist cluster, taka shto kje gi sporedish roots na drvata vo koe shto se naogjaat dvete teminja soodvetno
  32. {
  33. return(find_root(id1) == find_root(id2));
  34. }
  35. int find_root(int idx) // najdi root na drvoto vo koe shto se naogja temeto
  36. {
  37. int curr = idx;
  38. while(teminja[curr].parent != curr) // se dodeka nekoe teme ne e parent na sebesi
  39. {
  40. teminja[curr].parent = teminja[teminja[curr].parent].parent; // parentot na momentalnoto teme e parentot na negoviot parent (optimizacija za vreme, i bez ova raboti tochno no znacitelno pobavno)
  41. curr = teminja[curr].parent; // novoto teme za razgleduvanje e parentot
  42. }
  43. return(curr); // vrati go poslednoto teme shto sum go proveril (toa shto e parent na samoto sebesi)
  44. }
  45. void merge_trees(int id1, int id2) // spoi dve teminja (t.e drva)
  46. {
  47. int prv, vtor;
  48. prv = find_root(id1);
  49. vtor = find_root(id2); // najdi gi roots na dvete teminja
  50.  
  51. //vidi koe drvo e pomalo, i toa spoi go na pogolemoto, nivoto na drvoto ostanuva isto
  52. if(teminja[prv].tree_size < teminja[vtor].tree_size)
  53. teminja[prv].parent = teminja[vtor].parent;
  54. else if(teminja[prv].tree_size > teminja[vtor].tree_size)
  55. teminja[vtor].parent = teminja[prv].parent;
  56. else // dokolku se isti, spoi koe bilo na koe bilo, no nivoto na novoto drvo se zgolemuva za 1
  57. {
  58. teminja[vtor].parent = teminja[prv].parent;
  59. teminja[prv].tree_size += 1;
  60. }
  61. return;
  62. }
  63. };
  64.  
  65. bool sporedi(rebroQ a, rebroQ b) // komparator za da raboti sort funkcijata
  66. {
  67. if(a.weight == b.weight)
  68. {
  69. if(a.idx1 == b.idx1)
  70. return(a.idx2 < b.idx2);
  71.  
  72. return(a.idx1 < b.idx1);
  73. }
  74. return(a.weight < b.weight);
  75. }
  76.  
  77.  
  78. int main()
  79. {
  80. ios_base::sync_with_stdio(false);
  81.  
  82. int n, m; // broj na teminja i broj na rebra
  83. int n_found = 0; // broj na teminja staveni
  84. int t1, t2, td; // momentalni promenlivi
  85. cin >> n >> m;
  86. int MIN=1000000000;
  87. vector<rebroQ> edges(m);
  88. for(int i = 0; i < m; i++)
  89. {
  90. cin >> edges[i].idx1 >> edges[i].idx2 >> edges[i].weight; // chitanje na rebra
  91. edges[i].idx1--;
  92. edges[i].idx2--;
  93.  
  94. }
  95.  
  96. UF cluster(n);
  97.  
  98.  
  99. sort(edges.begin(), edges.end(), sporedi); // sortiranje na rebra
  100.  
  101. int izlez = 0;
  102. int zbir=0;
  103. vector<bool> nov(m),nov1(m);
  104. nov.assign(m,false);
  105. nov1.assign(m,false);
  106. for(int i = 0; i < m && n_found < n; i++)
  107. {
  108. t1 = edges[i].idx1;
  109. t2 = edges[i].idx2;
  110. td = edges[i].weight;
  111.  
  112.  
  113. if(!cluster.is_connected(t1, t2)) // dokolku dvete teminja ne se vo isto drvo
  114. {
  115.  
  116. izlez += td; // zgolemi go vkupniot zbir na rebrata na MST za tezinata na novoto rebro
  117. nov[i]=true;
  118.  
  119.  
  120. n_found++; // sum nashol novo teme
  121. cluster.merge_trees(t1, t2); // spoi gi
  122. }
  123.  
  124. }
  125.  
  126.  
  127. //memset(nov1,false,sizeof(nov1));
  128. for(int i = 0; i < m; i++)
  129. {
  130. if(!nov[i])
  131. {
  132. continue;
  133. }
  134. nov1[i]=true;
  135. zbir=0;
  136. UF cluster1(n);
  137. n_found=0;
  138. for(int j = 0; j < m; j++)
  139. {
  140.  
  141. t1 = edges[j].idx1;
  142. t2 = edges[j].idx2;
  143. td = edges[j].weight;
  144. if(nov1[j]==true)
  145. continue;
  146.  
  147.  
  148.  
  149. if(!cluster1.is_connected(t1, t2)) // dokolku dvete teminja ne se vo isto drvo
  150. {
  151.  
  152. zbir += td; // zgolemi go vkupniot zbir na rebrata na MST za tezinata na novoto rebro
  153.  
  154.  
  155.  
  156. n_found++; // sum nashol novo teme
  157. cluster1.merge_trees(t1, t2); // spoi gi
  158. }
  159.  
  160.  
  161. }
  162. nov1[i]=false;
  163. if(n_found==n-1)
  164. MIN=min(MIN,zbir);
  165.  
  166.  
  167. }
  168. cout << izlez <<" "<<MIN<<endl;
  169.  
  170. return(0);
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement