http://acm.nyist.net/JudgeOnline/problem.php?pid=38
#include <stdio.h> #include <memory.h> #define M 610 int g[M][M],dist[M]; int main() { int t,i,j,k,v,e,a,b,c,min,ans; scanf("%d",&t); while(t--) { memset(g,-1,sizeof(g)); scanf("%d%d",&v,&e); for(i=1;i<=v;i++) { dist[i]=11000; } ans=0; dist[1]=0; // 任意选一个顶点作为生成树的根节点 // 每次把一个顶点加到生成树中 所用的花费都是最少的 for(i=1;i<=e;i++) { scanf("%d%d%d",&a,&b,&c); g[a][b]=c; g[b][a]=c; if(a==1) { dist[b]=c; } if(b==1) { dist[a]=c; } } min=9999; for(i=1;i<=v;i++) { scanf("%d",&k); if(min>k) { min=k; } } ans+=min; c=1; while(1) { if(c==v) break; min=1000; for(i=1;i<=v;i++) { if(dist[i]&&min>dist[i])//找出到生成树的最小距离的顶点 { min=dist[i]; k=i; } } c++; ans+=min; //每次把一个顶点加到生成树中 所用的花费都是最少的 dist[k]=0;// 顶点k加入生成树后 距离更新为0 for(i=1;i<=v;i++) { if(g[k][i]>0) //如果有边 { if(g[k][i]<dist[i]) //更新生成树到顶点i的距离 { dist[i]=g[k][i]; } } } } printf("%d\n",ans); } return 0; }