#include<cstdio>#include<vector>#include<algorithm>
using namespace std;#define maxn 1000 + 1#define inf 1 << 29struct node {int b, c;node(int bb,int cc){
b = bb;
c = cc;}};int n, m;//顶点和边数
vector<node> vt[maxn];//邻接表 int dis[maxn];//顶点与集合S的距离
bool vis[maxn];//是否被访问intprim(int u){//从顶点u开始出发fill(dis, dis + n, inf);fill(vis, vis + n, false);int sum =0;//边权和
dis[u]=0;for(int k =0; k < vt[u].size(); k++){//初始化距离 int b = vt[u][k].b;if(vis[b]== false && vt[u][k].c < dis[b]){
dis[b]= vt[u][k].c;}}for(int i =0; i < n; i++){int v =-1, min = inf;for(int j =0; j < n; j++){if(vis[j]== false && dis[j]< min){//找到离集合最近的点 // printf("herehere\n");
v = j;
min = dis[j];}}if(v ==-1)return-1;
vis[v]= true;
sum += min;for(int k =0; k < vt[v].size(); k++){//b作为中介点,刷新距离 int b = vt[v][k].b;if(vis[b]== false && vt[v][k].c < dis[b]){
dis[b]= vt[v][k].c;}}}return sum;}intmain(){freopen("prim'sAlgorithmInput.txt","r",stdin);scanf("%d%d",&n,&m);while(m--){int a, b, c;scanf("%d%d%d",&a,&b,&c);
vt[a].push_back(node(b, c));
vt[b].push_back(node(a, c));}int distance =prim(0);//可以从任意一点出发 printf("%d", distance);return0;}