Pagini recente » Cod sursa (job #666896) | Cod sursa (job #626604) | Cod sursa (job #1944511) | Cod sursa (job #1884423) | Cod sursa (job #1850001)
#include <bits/stdc++.h>
using namespace std;
struct UnionFind {
vector<int> par;
vector<int> rank;
vector<int> size;
int c;
UnionFind(int n) : par(n), rank(n, 0), size(n, 1), c(n) {
for (int i = 0; i < n; i++) {
par[i] = i;
}
}
int find(int i) {
return (par[i] == i ? i : (par[i] = find(par[i])));
}
bool same(int i, int j) {
return find(i) == find(j);
}
int get_size(int i) {
return size[find(i)];
}
int count() {
return c;
}
void merge(int i, int j) {
i = find(i), j = find(j);
if (i == j) {
return;
}
c--;
if (rank[i] > rank[j]) {
swap(i, j);
}
par[i] = j;
size[j] += size[i];
if (rank[i] == rank[j]) {
rank[j]++;
}
}
};
struct E {
int u, v, weight;
E(int u, int v, int weight) : u(u), v(v), weight(weight) {}
};
bool operator<(const E& a, const E& b) {
return a.weight < b.weight;
}
int kruskal(vector<E>& edges, int V) {
sort(edges.begin(), edges.end());
int cost = 0, count = 0;
UnionFind uf(V);
for (auto& e : edges) {
if (!uf.same(e.u, e.v)) {
cost += e.weight;
uf.merge(e.u, e.v);
count++;
if (count == V - 1) {
break;
}
}
}
return cost;
}
int main() {
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
int n, m;
scanf("%d %d", &n, &m);
vector<E> edges;
for (int i = 0; i < m; i++) {
int x, y, c;
scanf("%d %d %d", &x, &y, &c);
x--, y--;
edges.emplace_back(x, y, c);
}
printf("%d\n", kruskal(edges, n));
return 0;
}