最大生成树,prime算法改一下就可以了,注意有重边!!!
#define N 1005
int g[N][N];
int vis[N];
int dis[N];
int n;
int prime(){
int i,j;
for(i=1;i<=n;i++){
dis[i] = g[1][i];
vis[i] = 0;
}
vis[1] = 1;
dis[1] = 0;
int ans = 0;
for(i=2;i<=n;i++){
int minm = 0;
int k = 0;
for(j=1;j<=n;j++){
if(!vis[j] && dis[j]>minm){
minm = dis[j];
k = j;
}
}
vis[k] = 1;
if(minm==0)return -1;
ans += minm;
for(j=1;j<=n;j++){
if(!vis[j] && dis[j] < g[j][k]){
dis[j] = g[j][k];
}
}
}
return ans;
}
int main(){
int m;
while(scanf("%d%d",&n,&m) !=-1){
int i,j;
for(i=0;i<=n;i++){
for(j=0;j<=n;j++){
g[i][j] = 0;
}
}
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b] = g[b][a] = max(g[a][b],c);//重边!
}
int ans = prime();
printf("%d\n",ans);
}
return 0;
}