#include <cstdio>
#include <cstdlib>
const int MAXN = 50; // 最大顶点数
const int INF = 1000000000; // 作为标记的无穷大值
int mat[MAXN][MAXN]; // 无向图的邻接矩阵
int mind[MAXN]; // 辅助数组
int v[MAXN]; // 标记顶点是否被访问过的数组
int n; // 顶点的个数
int prim() {
int ret = 0, i, j, k;
for (i = 0; i<n; i++) {
mind[i] = INF;
v[i] = 0;
}
for (mind[j = 0] = 0; j < n; j++) {
for (k = -1, i = 0; i < n; i++) {
if (!v[i] && (k == -1 || mind[i] < mind[k])) {
k = i;
}
}
v[k] = 1;
ret += mind[k];
for (i = 0; i < n; i++) {
if (!v[i] && mat[k][i] < mind[i]) {
mind[i] = mat[k][i];
}
}
}
return ret;
}
int main() {
scanf("%d", &n);
for (int i = 0;i < n;i++) {
// 读入无向图的邻接矩阵
for (int j = 0;j < n;j++) {
scanf("%d", &mat[i][j]);
if (mat[i][j] == 0)
mat[i][j] = INF;
}
}
printf("%d\n", prim());
return 0;
}
/**************************************************************
Problem: 2162
User: admin
Language: C++
Result: Accepted
Time:8 ms
Memory:1156 kb
****************************************************************/