#include #include #include #include using namespace std; const int MAXN = 1000; struct Edge { int from, to, price; Edge( int f, int t, int p ) : from(f), to(t), price(p) {} bool operator<( const Edge& e ) const { return price < e.price; } }; int N, M, parent[MAXN], rankk[MAXN]; vector edges; void input() { scanf("%d %d", &N, &M); int f, t, p; for( int i = 0; i < M; i++ ) { scanf("%d %d %d", &f, &t, &p); edges.push_back(Edge(f, t, p)); parent[edges[i].from-1] = edges[i].from-1; parent[edges[i].to-1] = edges[i].to-1; } } void union_trees( int from, int to ) { if( rankk[from] == rankk[to] ) { parent[to] = from; rankk[from]++; } else if( rankk[from] < rankk[to] ) { parent[from] = to; } else { parent[to] = from; } } int find( int node ) { if( parent[node] == node ) { return node; } return parent[node] = find(parent[node]); } void kruskal() { sort(edges.begin(), edges.end()); int i = 0, ans = 0, br = 0; while( br < N-1 ) { int p1 = find(edges[i].from); int p2 = find(edges[i].to); if( p1 != p2 ) { union_trees(p1, p2); br++; ans += edges[i].price; } i++; } printf("%d\n", ans); } int main() { input(); kruskal(); return 0; } /** 6 10 1 2 1 3 6 1 3 1 2 3 2 4 1 6 3 5 3 2 3 4 1 4 5 1 4 2 10 2 5 1 **/