#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 3e2 + 5;
struct Edge {
int u, v, w;
bool operator<(const Edge& other) const {
return w < other.w;
}
};
int n;
int w[N];
vector<Edge> edges;
int p[N], sz[N];
void initSet() {
for (int u = 0; u <= n; u++) {
p[u] = u;
sz[u] = 1;
}
}
int findSet(int u) {
if (p[u] == u) return u;
return p[u] = findSet(p[u]);
}
bool unionSet(int u, int v) {
u = findSet(u);
v = findSet(v);
if (u == v) return false;
if (sz[u] < sz[v]) swap(u, v);
p[v] = u;
sz[u] += sz[v];
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int u = 1; u <= n; u++) cin >> w[u];
for (int u = 1; u <= n; u++) {
for (int v = 1; v <= n; v++) {
int w; cin >> w;
edges.push_back({u, v, w});
}
}
// Tạo thêm một đỉnh ảo 0, có cạnh nối đến các đỉnh u từ 1 đến n
// Với trọng số cạnh chính là chi phí để đào một cái giếng ở đỉnh u
for (int u = 1; u <= n; u++) {
edges.push_back({0, u, w[u]});
}
// Tìm MST của tập đỉnh từ 0 đến n
sort(edges.begin(), edges.end());
initSet();
int ans = 0;
for (Edge e : edges) {
if (unionSet(e.u, e.v)) ans += e.w;
}
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAzZTIgKyA1OyAKCnN0cnVjdCBFZGdlIHsKCWludCB1LCB2LCB3OyAKCWJvb2wgb3BlcmF0b3I8KGNvbnN0IEVkZ2UmIG90aGVyKSBjb25zdCB7CgkJcmV0dXJuIHcgPCBvdGhlci53OyAgCgl9Cn07IAoKaW50IG47IAppbnQgd1tOXTsgCnZlY3RvcjxFZGdlPiBlZGdlczsgIAoKaW50IHBbTl0sIHN6W05dOyAKCnZvaWQgaW5pdFNldCgpIHsKCWZvciAoaW50IHUgPSAwOyB1IDw9IG47IHUrKykgewoJCXBbdV0gPSB1OyAgCgkJc3pbdV0gPSAxOyAgCgl9Cn0KCmludCBmaW5kU2V0KGludCB1KSB7CglpZiAocFt1XSA9PSB1KSByZXR1cm4gdTsgCglyZXR1cm4gcFt1XSA9IGZpbmRTZXQocFt1XSk7IAp9Cgpib29sIHVuaW9uU2V0KGludCB1LCBpbnQgdikgewoJdSA9IGZpbmRTZXQodSk7IAoJdiA9IGZpbmRTZXQodik7IAoJaWYgKHUgPT0gdikgcmV0dXJuIGZhbHNlOyAJCglpZiAoc3pbdV0gPCBzelt2XSkgc3dhcCh1LCB2KTsgCglwW3ZdID0gdTsgCglzelt1XSArPSBzelt2XTsgCglyZXR1cm4gdHJ1ZTsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgY2luID4+IHdbdV07IAoKCWZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgewoJCWZvciAoaW50IHYgPSAxOyB2IDw9IG47IHYrKykgewoJCQlpbnQgdzsgY2luID4+IHc7IAoJCQllZGdlcy5wdXNoX2JhY2soe3UsIHYsIHd9KTsgCgkJfSAKCX0KCgkvLyBU4bqhbyB0aMOqbSBt4buZdCDEkeG7iW5oIOG6o28gMCwgY8OzIGPhuqFuaCBu4buRaSDEkeG6v24gY8OhYyDEkeG7iW5oIHUgdOG7qyAxIMSR4bq/biBuCgkvLyBW4bubaSB0cuG7jW5nIHPhu5EgY+G6oW5oIGNow61uaCBsw6AgY2hpIHBow60gxJHhu4MgxJHDoG8gbeG7mXQgY8OhaSBnaeG6v25nIOG7nyDEkeG7iW5oIHUKCWZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgewoJCWVkZ2VzLnB1c2hfYmFjayh7MCwgdSwgd1t1XX0pOyAgCgl9CgoJLy8gVMOsbSBNU1QgY+G7p2EgdOG6rXAgxJHhu4luaCB04burIDAgxJHhur9uIG4KCXNvcnQoZWRnZXMuYmVnaW4oKSwgZWRnZXMuZW5kKCkpOyAgCgoJaW5pdFNldCgpOyAgCgoJaW50IGFucyA9IDA7ICAKCWZvciAoRWRnZSBlIDogZWRnZXMpIHsKCQlpZiAodW5pb25TZXQoZS51LCBlLnYpKSBhbnMgKz0gZS53OyAKCX0KCgljb3V0IDw8IGFucyA8PCAnXG4nOyAKfQ==