#include<stdio.h> #include<string.h> using namespace std; int map[505][505]; int v, e; int prime() { bool vis[505]; int dist[505]; int i,j,sum=0; for(i=1;i<=v;i++) { vis[i]=0; //先假设编号为1的点加入MST dist[i]=map[1][i]; } vis[1]=1; for(i=1;i<v;i++) { int k,min=0x3f3f3f3f; for(j=1;j<=v;j++) { if(!vis[j]&&dist[j]<min) { min=dist[j]; k=j; } } /* 在这也统计下加入了几天边,判断是否构成MST */ sum+=dist[k]; vis[k]=1; //下面更新已加入最小生成树的点离其它点的最短距离 for(j=1;j<=v;j++) { if(!vis[j]&&dist[j]>map[k][j]) dist[j]=map[k][j]; } } return sum; } int main() { int n; int i; int waibu; scanf("%d", &n); while(n--) { memset(map, 0, sizeof(map)); scanf("%d %d", &v, &e); int a, b, c; for(i = 0; i< e; i++) { scanf("%d %d %d", &a, &b, &c); map[a][b] = c; map[b][a] = c; } int min = 0x3f3f3f3f; for(i = 0; i< v; i++) { scanf("%d", &waibu); if(min > waibu) min = waibu; } printf("%d ", prime() + min); } return 0; }