Advertisement
Elsas

Algo10C

Mar 30th, 2020
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.18 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <tuple>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. int FindRoot(vector<int> &roots, int v)
  9. {
  10. if (v != roots[v])
  11. roots[v] = FindRoot(roots, roots[v]);
  12. return roots[v];
  13. }
  14.  
  15. void Kruskal( vector<int> &roots, vector<int> &rootssize, long long &answer, int v1, int v2, int weight)
  16. {
  17. if (v1 != v2)
  18. {
  19. answer += weight;
  20. if (rootssize[v1] < rootssize[v2])
  21. swap(v1, v2);
  22. roots[v2] = v1;
  23. rootssize[v1] += rootssize[v2];
  24. }
  25. }
  26.  
  27. int main()
  28. {
  29. ifstream fcin("spantree3.in");
  30. ofstream fcout("spantree3.out");
  31.  
  32. int n, m;
  33. fcin >> n >> m;
  34.  
  35. vector<tuple<int, int, int>> edges(m);
  36. vector<int> roots(n);
  37. vector<int> rootssize(n, 1);
  38.  
  39. for (int i = 0; i < n; i++)
  40. roots[i] = i;
  41.  
  42. for (int i = 0; i < m; i++)
  43. {
  44. int in, out, way;
  45. fcin >> out >> in >> way;
  46. edges[i] = {way, out - 1, in - 1};
  47. }
  48.  
  49. sort(edges.begin(), edges.end());
  50.  
  51. long long answer = 0;
  52. for (int i = 0; i < edges.size(); i++)
  53. {
  54. int weight = get<0>(edges[i]), v1 = FindRoot(roots, get<1>(edges[i])), v2 = FindRoot(roots, get<2>(edges[i]));
  55. Kruskal(roots, rootssize, answer, v1, v2, weight);
  56. }
  57.  
  58. fcout << answer;
  59.  
  60. return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement