#include<algorithm> #include<iostream> #include<cstdio> using namespace std; struct edge{ int a,b,v; }e[100001]; int n,tot,fa[302]; void insert(int a,int b,int v){ e[++tot]=(edge){a,b,v}; } int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } bool cmp(edge a,edge b){ return a.v<b.v; } int krustral(){ int sum=0; for(int i=1;i<=tot;i++){ int p=find(e[i].a),q=find(e[i].b); if(p!=q){ fa[p]=q;sum+=e[i].v; } } return sum; } inline int read(){ int x=0;char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x; } int main(){ n=read(); for(int i=1;i<=n;i++){ int x=read(); insert(0,i,x); fa[i]=i; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ int x=read(); if(!x)continue; insert(i,j,x); } sort(e+1,e+tot+1,cmp); printf("%d\n",krustral()); return 0; }