#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int f[1200];
struct node
{
int u,v,w;
} e[120000];
int cmp(struct node a,struct node b)
{
return a.w<b.w;
}
int getf(int a)
{
if(f[a]==a)
{
return a;
}
f[a]=getf(f[a]);
return f[a];
}
int bingchaji(int a,int b)
{
int t1,t2;
t1=getf(a);
t2=getf(b);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
return 0;
}
int main()
{
int n,m,i,sum,num;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=1; i<=m; i++)
{
scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);
}
sort(e+1,e+m+1,cmp);
for(i=1; i<=n; i++)
{
f[i]=i;
}
num=0;
sum=0;
for(i=1; i<=m; i++)
{
if(bingchaji(e[i].u,e[i].v))
{
num++;
sum+=e[i].w;
}
if(num==n-1)
{
break;
}
}
if(num!=n-1)
{
printf("%d\n",-1);
}
else
{
printf("%d\n",sum);
}
}
return 0;
}
(ku)
#include<iostream>
#include <bits/stdc++.h>
#define MAX 0x3f3f3f3f
#define N 1100
using namespace std;
int low[N],ma[N][N],visit[N];
int n;
int prim()//普里姆算法
{
int i,j,pos,mi,result=0;
memset(visit,0,sizeof(visit));
visit[1]=1;
pos=1;
for(i=1; i<=n; i++)
{
if(i!=pos)
{
low[i]=ma[pos][i];
}
}
for(i=1; i<n; i++)
{
mi=MAX;
for(j=1; j<=n; j++)
{
if(visit[j]==0 && mi>low[j])
{
mi=low[j];
pos=j;
}
}
if(MAX==mi)
{
return -1;
}
result+=mi;
visit[pos]=1;
for(j=1; j<=n; j++)
{
if(visit[j]==0 && low[j]>ma[pos][j])
{
low[j]=ma[pos][j];
}
}
}
return result;
}
int main()
{
int m,a,b,c,k,i;
while(cin>>n>>m && n)
{
memset(ma,MAX,sizeof(ma));
for(i=1; i<=m; i++)
{
cin>>a>>b>>c;
if(ma[a][b]>c)//居然还有相同边....醉了...
{
ma[a][b]=ma[b][a]=c;
}
}
k=prim();
cout<<k<<endl;
}
return 0;
}