fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 1e4 + 5;
  12.  
  13. struct Edge {
  14. int u, v, c;
  15. bool operator<(const Edge& other) const {
  16. return c < other.c;
  17. }
  18. };
  19.  
  20. int n, m;
  21. vector<int> adj[N];
  22. vector<Edge> edges;
  23.  
  24. int p[N], sz[N];
  25.  
  26. void initSet() {
  27. for (int u = 1; u <= n; u++) {
  28. p[u] = u;
  29. sz[u] = 1;
  30. }
  31. }
  32.  
  33. int findSet(int u) {
  34. if (p[u] == u) return u;
  35. return p[u] = findSet(p[u]);
  36. }
  37.  
  38. bool unionSet(int u, int v) {
  39. u = findSet(u);
  40. v = findSet(v);
  41. if (u == v) return false;
  42. if (sz[u] < sz[v]) swap(u, v);
  43. p[v] = u;
  44. sz[u] += sz[v];
  45. return true;
  46. }
  47.  
  48. int main() {
  49. ios::sync_with_stdio(false);
  50. cin.tie(nullptr);
  51. cin >> n >> m;
  52.  
  53. for (int i = 0; i < m; i++) {
  54. int u, v, c;
  55. cin >> u >> v >> c;
  56. edges.push_back({u, v, c});
  57. }
  58.  
  59. // Thuật toán Kruskal
  60. sort(edges.begin(), edges.end());
  61.  
  62. initSet();
  63.  
  64. int ans = 0;
  65. for (Edge e : edges) {
  66. if (unionSet(e.u, e.v)) ans += e.c;
  67. }
  68.  
  69. cout << ans << '\n';
  70. }
Success #stdin #stdout 0s 5256KB
stdin
6 9
1 2 1
1 3 1
2 4 1
2 3 2
2 5 1
3 5 1
3 6 1
4 5 2
5 6 2
stdout
5