#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int x, y, cost;
};
vector<int> parent, glub;
int findMN(int num){ //Ищем множество в котором находится вершина
if (num == parent[num]) {
return num;
}
return parent[num] = findMN(parent[num]);
}
int ob(int x, int y) {
x = findMN(x);
y = findMN(y);
if (x == y) {
return 0;
}
if (glub[x] < glub[y]) {
swap(x, y);
}
parent[y] = x;
if (glub[x] == glub[y]) {
glub[x]++;
}
return 1;
}
int comp(Edge a, Edge b) {
return a.cost < b.cost;
}
int main() {
int n, m;
cin >> n >> m;
parent.resize(++n);
glub.resize(n);
for (int i = 1; i <= n; i++) {
parent[i] = i;
//glub[i] = 0;
}
vector<Edge> g(m);
for (int i = 0; i < m; i++) {
cin >> g[i].x >> g[i].y >> g[i].cost;
}
sort(g.begin(), g.end(), comp);
int ans = 0;
for (int i = 0; i < m; i++) {
if (ob(g[i].x, g[i].y)) {
ans += g[i].cost;
}
}
cout << ans;
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int x, y, cost;
};
int comp(Edge a, Edge b) {
return a.cost < b.cost;
}
vector<int> parent, depth;
int findMN(int num){ //рекурсивно ищем множество
if (num == parent[num]) {
return num;
}
return parent[num] = findMN(parent[num]);
}
bool check(int x, int y) { //ищем предков и находим их после чего проверяем на циклы и добавляем
x = findMN(x);
y = findMN(y);
if (x == y) { //если они из одного множества нам такие не нужны
return 0;
}
parent[y] = x;
return 1;
}
int main(){
int n, m, ans = 0;
cin >> n >> m;
vector<Edge> g(m);
parent.resize(++n);
for (int i = 1; i <= n; ++i) {
parent[i] = i;
}
for (int i = 0; i < m; ++i) {
int x, y, cost;
cin >> x >> y >> cost;
g[i].x = x;
g[i].y = y;
g[i].cost = cost;
}
sort(g.begin(), g.end(), comp);
for (int i = 0; i < m; i++) {
if (check(g[i].x, g[i].y)) {
ans += g[i].cost;
}
}
cout << ans;
return 0;
}
parent.resize(++n);
glub.resize(n);
for (int i = 1; i <= n; i++) {
parent.resize(n+1);
glub.resize(n+1);
for (int i = 1; i <= n; i++) {
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int x, y, cost;
};
vector<int> parent, glub;
int findMN(int num){ //Ищем множество в котором находится вершина
if (num == parent[num]) {
return num;
}
return parent[num] = findMN(parent[num]);
}
int ob(int x, int y) {
x = findMN(x);
y = findMN(y);
if (x == y) {
return 0;
}
if (glub[x] < glub[y]) {
swap(x, y);
}
parent[y] = x;
if (glub[x] == glub[y]) {
glub[x]++;
}
return 1;
}
int comp(Edge a, Edge b) {
return a.cost < b.cost;
}
int main() {
int n, m;
cin >> n >> m;
parent.resize(++n);
glub.resize(n);
for (int i = 1; i <= n; i++) {
parent[i] = i;
glub[i] = 0;
}
vector<Edge> g(m);
for (int i = 0; i < m; i++) {
cin >> g[i].x >> g[i].y >> g[i].cost;
}
sort(g.begin(), g.end(), comp);
int ans = 0;
for (int i = 0; i < m; i++) {
if (ob(g[i].x, g[i].y)) {
ans += g[i].cost;
}
}
cout << ans;
return 0;
}