注意每个点也有价值。
#include"stdio.h" #include"string.h" #define INF 1000000000 int mark[1001],f[1001],n,map[1001][1001]; void prime() { int i,j,min,k,ans; memset(mark,0,sizeof(mark)); for(i=0;i<n;i++) f[i]=map[0][i]; f[0]=0;mark[0]=1; ans=0; for(i=0;i<n-1;i++) { min=INF; for(j=0;j<n;j++) { if(!mark[j]&&min>f[j]) { min=f[j];k=j; } } ans+=min; mark[k]=1; for(j=0;j<n;j++) { if(!mark[j]&&f[j]>map[k][j]) f[j]=map[k][j]; } } printf("%d\n",ans); } int main() { int i,j,T,a[1001],b; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); memset(map,76,sizeof(map)); for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&b); if(i!=j) map[i][j]=a[i]+a[j]+b; } } prime(); } return 0; }