#include<cstdio> #include<algorithm> using namespace std; const int MAXV = 1000; const int INF = 0xFFFFFFF; struct edge{ int u,v,cost; }E[MAXV]; bool cmp(edge a,edge b){ return a.cost < b.cost; } int father[MAXV]; int findFather(int x) { int a = x; while(x != father[x]) x=father[x]; //路径压缩 while(a != father[a]) { int temp = a; a = father[a]; father[temp]=x; } return x; } int kruskal(int n,int m) { int ans=0,numEdge=0; for(int i=0;i<n;i++) father[i]=i; sort(E,E+m,cmp); for(int i=0;i<m;i++) { int faU=findFather(E[i].u); int faV=findFather(E[i].v); if(faU!=faV) { father[faU]=faV; ans += E[i].cost; numEdge++; if(numEdge==n-1) break; } } if(numEdge!=n-1) return -1; return ans; } int main(void) { int m,n; scanf("%d%d",&n,&m); for(int i=0;i<m;i++) scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].cost); int ans = kruskal(n,m); printf("%d",ans); return 0; } /* 6 10 0 1 4 0 4 1 0 5 2 1 2 1 1 5 3 2 3 6 2 5 5 3 4 5 3 5 4 4 5 3 output: 11 */