1 4 6 1 2 10 2 3 10 3 1 10 1 4 1 2 4 1 3 4 1 1 3 5 6
4
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace
std;
#define MAX 1000000
int main(int argc, char* argv[])
{
int
T;
int v,e,i,j,k,a,b,c,t;
int f[505][505];
int
d[505];
int low[505];
int clo[505];
bool
s[505];
scanf("%d",&T);
while(T--)
{
int min,sum=0;
memset(f,0,sizeof(f));
memset(d,0,sizeof(d));
memset(low,0,sizeof(low));
memset(clo,0,sizeof(clo));
memset(s,0,sizeof(s));
scanf("%d%d",&v,&e);
for(i=0;i<=v;i++)
{
for(j=0;j<=i;j++)
f[i][j]=f[j][i]=MAX;
}
for(i=1;i<=e;i++)
{
scanf("%d%d%d",&a,&b,&c);
f[a][b]=c;
f[b][a]=c;
}
for(j=0;j<v;j++)
{
scanf("%d",&d[j]);
}
for(i=1;i<=v;i++)
{
low[i]=f[1][i];
}
memset(s,0,sizeof(s));
s[1]=true;
for(i=1;i<v;i++)
{
min=MAX;
for(k=1;k<=v;k++)
if((low[k]<min)&&(!s[k]))
{
min=low[k];
t=k;
}
s[t]=true;
sum+=min;
for(k=1;k<=v;k++)
if((f[t][k]<low[k])&&(!s[k]))
{
low[k]=f[t][k];
}
}
sort(d,d+v);
sum+=d[0];
printf("%d\n",sum);
}
return
0;
}
原文:http://www.cnblogs.com/52Cyan/p/3676511.html