#include <bits/stdc++.h>
using namespace std;
const int N=510;
struct RawEdge{
int from,to,val;
};
vector<RawEdge> edges;
int fa[N];
bool cmp(RawEdge &a,RawEdge &b){
return a.val<b.val;
}
int get_fa(int cur){
if(cur==fa[cur]){
return cur;
}
fa[cur]=get_fa(fa[cur]);
return fa[cur];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,i,j;
cin >> n;
for(i=0;i<+n;i++){
fa[i]=i;
}
for(i=1;i<=n;i++){
int w;
cin >> w;
edges.push_back((RawEdge){0,i,w});
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
int p;
cin >> p;
if(p!=0){
edges.push_back((RawEdge){i,j,p});
}
}
}
sort(edges.begin(),edges.end(),cmp);
int val=0;
for(i=0;i<edges.size();i++){
const int u=edges[i].from;
const int v=edges[i].to;
if(get_fa(u)==get_fa(v)){
continue;
}
fa[get_fa(u)]=get_fa(v);
val=val+edges[i].val;
}
cout << val;
return 0;
}
求助,必关注