虽说是复习,但还是要贴上,文章+1
#include <stdio.h>
#include <string.h>
#include <iostream>
#include<algorithm>
#include <vector>
#include <queue>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define INF 0x3f3f3f3f
#define mem(arr,a) memset(arr,a,sizeof(arr))
#define N 5000+5
#define pow(a) ((a)*(a))
struct edge{
int u, v, w;
};
int par[N];
edge es[N];
int sum;
int n, m;
bool cmp(edge a, edge b){
return a.w < b.w;
}
void init(){
for (int i = 1; i <= n; i++)par[i] = i;
}
int find(int x){
if (x == par[x])return x;
return par[x] = find(par[x]);
}
bool same(int a, int b){
a = find(a);
b = find(b);
if (a==b)return true;
return false;
}
void unite(int a, int b){
a = find(a);
b = find(b);
par[a] = b;
}
int kruskal(){
sort(es+1, es + m+1, cmp);
for (int i = 1; i <= m; i++){
edge e = es[i];
if (!same(e.u, e.v)){
unite(e.u, e.v);
sum += e.w;
}
}
return sum;
}
int main(){
while (~scanf("%d", &n)){
if (n == 0)break;
scanf("%d", &m);
init();
sum = 0;
for (int i = 1; i <= m; i++){
scanf("%d%d%d", &es[i].u, &es[i].v, &es[i].w);
}
printf("%d\n", kruskal());
}
}