#include <iostream> #include <cstdio> #include <cstring> const int INF=1000000000; const int maxn=510; using namespace std; int map[maxn][maxn],dis[maxn],visited[maxn]; int main() { int n,a,b,k,i,j,N,E,mindistance,min,t; scanf("%d",&n); while (n--) { memset(visited,0,sizeof(visited)); mindistance=0; scanf("%d%d",&N,&E); for (i=0;i<N;i++) { for (j=0;j<N;j++) { map[i][j]=INF; } } for (i=0;i<E;i++) { scanf("%d%d%d",&a,&b,&k); map[a][b]=map[b][a]=k; } for (j=0;j<N;j++) { dis[j]=map[0][j];//初始化最短距离 } visited[0]=1;//标记已经连接此点 for (i=0;i<N;i++) { min=INF; for (j=0;j<N;j++) { if(!visited[j] && min>dis[j]) { min=dis[j]; t=j; } } if(min!=INF)//值得注意的地方 mindistance+=min;//总耗费 visited[t]=1; for (j=0;j<N;j++) { if (!visited[j] && dis[j]>map[t][j]) { dis[j]=map[t][j];//更新已连接的点与各无连接的点的最短距离 } } } printf("%d\n",mindistance); } return 0; }
Sample Input
1 3 3 0 1 5 0 2 0 1 2 9
Sample Output
5