我wa死了,是因为点的权值没有很好地记录下来,后来看sunkehappy的解题报告,明白这题需要在初始化的时候把点的权值加到边上,这样就可以省去最后计算的麻烦了,改了之后就直接过了。。哎,,苍天啊。。 #include<iostream> #include<cstdlib> #include<cstdio> using namespace std; const int M = 1001; const int INF = 99999999; int mat[M][M]; int ada[M],dist[M],flag[M]; int main(void) { int cases,n; int i,j,now; int min,sum; cin >> cases; while( cases-- ) { cin >> n; for( i = 1; i <= n; i++ ) cin >> ada[i];ada[0]=0; for( i = 1; i <= n; i++ ) for( j = 1; j <= n; j++ ) { cin >> mat[i][j]; mat[i][j] += ada[i]; mat[i][j] += ada[j]; } for( i = 1; i <= n; i++ ) { dist[i] = INF; flag[i] = 0; } sum = 0; dist[now=1]=0; flag[now] = 1; for( i = 1; i < n; i++ ) { for( j = 1; j <= n; j++ ) if( !flag[j] && dist[j] > mat[now][j] ) dist[j] = mat[now][j]; for( j = 1,min = INF; j <= n; j++ ) if( !flag[j] && dist[j] < min ) min = dist[now=j]; flag[now] = 1; sum += min; } cout << sum << endl; } return 0; }