#include<stdio.h>
#define MAX_VERTEX_NUM 100
int parent[MAX_VERTEX_NUM];
typedef struct
{
int weight;
int begin;
int end;
}Edge;
int Find(int *parent,int f)
{
while(parent[f]>0)
f=parent[f];
return f;
}
int main()
{
int N,num,k=0,sum=0,m,n;
Edge edges[MAX_VERTEX_NUM*MAX_VERTEX_NUM],temp;
scanf("%d",&N);
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
scanf("%d",&num);
if(num!=0&&i<j)
{
edges[k].weight=num;
edges[k].begin=i;
edges[k].end=j;
k++;
}
}
}
for(int i=0;i<k;i++)
{
for(int j=i;j<k;j++)
{
if(edges[i].weight>edges[j].weight)
{
temp.weight=edges[i].weight;
temp.begin=edges[i].begin;
temp.end=edges[i].end;
edges[i].weight=edges[j].weight;
edges[i].begin=edges[j].begin;
edges[i].end=edges[j].end;
edges[j].weight=temp.weight;
edges[j].begin=temp.begin;
edges[j].end=temp.end;
}
}
}
for(int i=0;i<N;i++)
{
parent[i]=0;
}
for(int i=0;i<k;i++)
{
n=Find(parent,edges[i].begin);
m=Find(parent,edges[i].end);
if(n!=m)
{
parent[n]=m;
sum+=edges[i].weight;
}
}
printf("%d\n",sum);
return 0;
}
/**************************************************************
Problem: 2162
User: admin
Language: C
Result: Accepted
Time:8 ms
Memory:1144 kb
****************************************************************/