题意:求一个最小生成树。
思路:prim最小生成树。
#include <cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<queue>
#define MAXN 1005
using namespace std;
int g[MAXN][MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int pri[MAXN]= {0};
for(int i=0; i<n; ++i) scanf("%d",&pri[i]);
memset(g,0x7f,sizeof(g));
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
{
int t;
scanf("%d",&t);
if(i!=j) g[i][j]=t+pri[i]+pri[j];
}
int ans=0;
int mincost[MAXN],nearvex[MAXN]= {0};
int used[MAXN]= {0};
memset(mincost,0x7f,sizeof(mincost));
mincost[0]=0;
while(true)
{
int v=-1;
for(int i=0; i<n; ++i)
if(!used[i]&&(v==-1||mincost[i]<mincost[v]))v=i;
if(v==-1) break;
used[v]=true;
ans+=mincost[v];
for(int i=0; i<n; ++i)
{
if(mincost[i]>g[v][i])
mincost[i]=g[v][i];
}
}
printf("%d\n",ans);
}
return 0;
}