1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 using namespace std; 6 struct build 7 { 8 int b,e,num; 9 }bu[125000]; 10 bool cmp(build a,build b) 11 { 12 return a.num<b.num; 13 } 14 int p[510]; 15 int find(int n) 16 { 17 return p[n]==n?n:p[n]=find(p[n]); 18 } 19 int kruskal(int m) 20 { 21 int sum=0,i; 22 for(i=0;i<510;i++) 23 p[i]=i; 24 sort(bu,bu+m,cmp); 25 for(i=0;i<m;i++) 26 { 27 int x,y; x=find(bu[i].b);y=find(bu[i].e); 28 if(x!=y) 29 { 30 sum+=bu[i].num; 31 p[x]=y; 32 } 33 } 34 return sum; 35 } 36 37 int main() 38 { 39 int n,v,e,i,a; 40 scanf("%d",&n); 41 while(n--) 42 { 43 scanf("%d%d",&v,&e); 44 for(i=0;i<e;i++) 45 scanf("%d%d%d",&bu[i].b,&bu[i].e,&bu[i].num); 46 int min=7634634; 47 for(i=0;i<v;i++) 48 { 49 scanf("%d",&a); 50 if(a<min) 51 min=a; 52 } 53 printf("%d ",min+kruskal(e)); 54 } 55 return 0; 56 }
布线问题 思路 并查集 初始每个城市是一个集合 然后从距离最短的找 不属于一个集合 那么就合并为一个集合 最后的集合就是整个线路了