在用 Prim的时候只要将 adapter 事先算如边中即可
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define LLEN 10010
#define MLEN 1010
#define INF 999999999
int adapter[LLEN];
int map[MLEN][MLEN];
void prim(int s, int n) {
int lowcost[MLEN];
int nearvex[MLEN];
int sum = 0;
int i, j;
for(i = 0; i < n; i++) {
lowcost[i] = map[s][i];
nearvex[i] = s;
}
nearvex[s] = -1;
for(i = 1; i < n; i++) {
int min = INF;
int v = -1;
for(j = 0; j < n; j++) {
if(lowcost[j] < min && nearvex[j] != -1) {
v = j;
min = lowcost[j];
}
}
if(v != -1) {
nearvex[v] = -1;
sum += min;
for(j = 0; j < n; j++) {
if(nearvex[j] != -1 && map[v][j]< lowcost[j]) {
lowcost[j] = map[v][j];
nearvex[j] = v;
}
}
}
}
printf("%d\n", sum);
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &adapter[i]);
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%d", &map[i][j]);
if(i != j) {
map[i][j] += adapter[i] + adapter[j];
}
}
}
prim(0, n);
}
return 0;
}