好纠结啊。。。这题蛮水的。。。。把买adopters的费用加到map里就行了。。。很顺利滴写完了。。交了。。WA.。。 查了半天错。。。i j写错了。。。我了个去啊。。。以后不用i j 了,我用i k。。。。 #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> const int N = 1002; using namespace std; int map[N][N],n; void input() { int i,j,cost[N],value; cin >> n; for(i=1; i<=n; i++) cin >> cost[i]; for(i=1; i<=n; i++) for(j=1; j<=n; j++) { map[i][j] = 0; cin >> value; if( i == j ) continue; map[i][j] = ( value + cost[j] + cost[i]); } } void prim() { int hash[N],dis[N],i,j,sum = 0,now,min; for(i=1; i<=n; i++) { hash[i] = 0; dis[i] = INT_MAX; } now = 1; dis[now] = 0; hash[now] = 1; for(i=1; i<n; i++) { for(j=1; j<=n; j++) if( !hash[j] && dis[j] > map[now][j] ) dis[j] = map[now][j]; min = INT_MAX; for(j=1; j<=n; j++) if( !hash[j] && dis[j] < min ) min = dis[now = j]; hash[now] = 1; sum += min; } cout << sum << endl; } int main(void) { int ncases; cin >> ncases; while( ncases-- ) { input(); prim(); } return 0; }