Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <iterator>
  5. #include <set>
  6. using namespace std;
  7.  
  8. void mergesort(long *weight, long *x, long *y, long l, long r)
  9. {
  10. long j=l, k, i;
  11. long m[r], cpyx[r], cpyy[r];
  12. long middle;
  13. middle = (r + l) / 2;
  14. k = middle + 1;
  15. for (i = l; i <= r; i++)
  16. {
  17. if (((k > r) || (weight[j] < weight[k])) && (j <= middle))
  18. {
  19. m[i] = weight[j];
  20. cpyx[i] = x[j];
  21. cpyy[i] = y[j];
  22. j ++;
  23. }
  24. else
  25. {
  26. m[i] = weight[k];
  27. cpyx[i] = x[k];
  28. cpyy[i] = y[k];
  29. k ++;
  30. }
  31. }
  32. for (i = l; i <= r; i++)
  33. {
  34. weight[i] = m[i];
  35. x[i] = cpyx[i];
  36. y[i] = cpyy[i];
  37. }
  38. };
  39.  
  40. void merge(long *weight, long *x, long* y, long l, long r)
  41. {
  42. if (l < r)
  43. {
  44. merge(weight, x, y, l, (l + r) / 2);
  45. merge(weight, x, y, (l + r) / 2 + 1, r);
  46. mergesort(weight, x, y, l, r);
  47. }
  48. };
  49.  
  50. int main()
  51. {
  52. long n, m, i;
  53. // freopen("spantree3.in", "r", stdin);
  54. // freopen("spantree3.out", "w", stdout);
  55. cin >> n >> m;
  56. long x[m], y[m], weight[m];
  57. set <long> comp[n];
  58. vector<long> flags;
  59. for (i = 1; i <= m; i++)
  60. cin >> x[i] >> y[i] >> weight[i];
  61. flags.resize(n);
  62. for (i = 1; i <= n; i++)
  63. flags[i] = 0;
  64. merge(weight, x, y, 1, m);
  65. long long sum = 0;
  66. long k = 1;
  67. for (i = 1; i <= m; i++)
  68. {
  69. if (((flags[x[i]] == 0) && (flags[y[i]] == 0)) && (x[i] != y[i]))
  70. {
  71. comp[k].insert(x[i]);
  72. comp[k].insert(y[i]);
  73. flags[x[i]] = k;
  74. flags[y[i]] = k;
  75. k++;
  76. sum += weight[i];
  77. }
  78. else
  79. {
  80. if ((flags[x[i]] != 0) && (flags[y[i]] == 0))
  81. {
  82. flags[y[i]] = flags[x[i]];
  83. comp[flags[x[i]]].insert(y[i]);
  84. sum += weight[i];
  85. }
  86. else
  87. {
  88. if ((flags[y[i]] != 0) && (flags[x[i]] == 0))
  89. {
  90. flags[x[i]] = flags[y[i]];
  91. comp[flags[y[i]]].insert(x[i]);
  92. sum += weight[i];
  93. }
  94. else
  95. if ((flags[x[i]] != 0) && (flags[y[i]] != 0) && (flags[x[i]] != flags[y[i]]))
  96. {
  97. int cop = flags[y[i]];
  98. for (auto z:comp[flags[y[i]]])
  99. {
  100. comp[flags[x[i]]].insert(z);
  101. flags[z] = flags[x[i]];
  102. }
  103. sum += weight[i];
  104. }
  105. }
  106. }
  107. }
  108. cout << sum;
  109. return 0;
  110. }
  111. /*
  112. 4 4
  113. 1 2 1
  114. 2 3 2
  115. 3 4 5
  116. 4 1 4
  117. */
  118. /*
  119. 4 3
  120. 1 3 1
  121. 1 2 2
  122. 2 4 1
  123. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement