01#include <stdio.h> 02#include <string.h> 03#include <stdlib.h> 04#include <algorithm> 05using namespace std; 06struct edge{ 07 int u,v,w; 08}p[3333]; 09int pre[1024],n,m,u,v,i,q,t,cnt,ans; 10int cmp(edge a,edge b){ 11 if(a.w==b.w){ 12 if(a.u==b.u) 13 return a.v<b.v; 14 return a.u<b.u; 15 } 16 return a.w<b.w; 17} 18int find(int x){ 19 t=x; 20 while(t!=pre[t]) 21 t=pre[t]; 22 while(x!=pre[x]) 23 q=pre[x],pre[x]=t,x=q; 24 return x; 25} 26int main(){ 27 while(~scanf("%d %d",&n,&m)){ 28 ans=cnt=0; 29 for(i=1;i<=n;i++) 30 pre[i]=i; 31 for(i=0;i<m;i++) 32 scanf("%d %d %d",&p[i].u,&p[i].v,&p[i].w); 33 sort(p,p+m,cmp); 34 for(i=0;i<m;i++) 35 if(find(p[i].u)!=find(p[i].v)) 36 pre[max(find(p[i].u),find(p[i].v))]=min(find(p[i].u),find(p[i].v)),ans+=p[i].w,cnt++; 37 if(cnt<n-1) 38 ans=-1; 39 printf("%d\n",ans); 40 } 41 return 0; 42}
转载于:https://www.cnblogs.com/CCCrunner/p/6444571.html
相关资源:数据结构大作业-寻径问题