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;
}