显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000;
int a[maxn][maxn],n,tot,lowcost[maxn],used[maxn];
void Init();
void Prim();
int main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
Init();
Prim();
printf("%d\n",tot);
return 0;
}
void Init(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
a[i][n+1]=a[n+1][i]=x;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x;scanf("%d",&x);
a[i][j]=a[j][i]=x;
}
}
memset(lowcost,0x7f,sizeof(lowcost));
memset(used,0,sizeof(used));
}
void Prim(){
used[1]=1;
for(int i=1;i<=n+1;i++){
lowcost[i]=a[i][1];
}
for(int i=1;i<=n;i++){
int min=0x7f7f7f7f,k;
for(int j=1;j<=n+1;j++){
if(!used[j]&&lowcost[j]<min){
min=lowcost[j];
k=j;
}
}
used[k]=1;
tot+=lowcost[k];
for(int j=1;j<=n+1;j++){
if(!used[j]&&a[j][k]<lowcost[j]){
lowcost[j]=a[j][k];
}
}
}
}