#include <iostream>
#include <algorithm>
using namespace std;
//挑战程序设计竞赛例题
//感谢博友文章
//The input includes several cases
const int INF=1000000;
//矩阵表示距离
int cost[101][101];//cost[u][v]表示边e=(u,v)的权值(不存在的情况下设为INF)
int mincost[101];//从集合X出发的边到每个顶点的最小权值
bool used[101];//顶点i是否包含在集合X中
int V;//顶点数
int main()
{
while(cin>>V)
{
//scanf("%d",&V);
for(int i=0;i<V;i++)
{
for(int j=0;j<V;j++)
{
cin>>cost[i][j];
//scanf("%d",&cost[i][j]);
}
}
for(int i=0;i<V;i++)
{
mincost[i]=INF;
used[i]=false;
}
mincost[0]=0;
int res=0;
while(true)
{
int v=-1;
//从不属于X的顶点中选取从X到其权值最小的顶点
for(int u=0;u<V;u++)
{
if(!used[u]&&(v==-1||mincost[u]<mincost[v]))
{
v=u;
}
}
if(v==-1)
{
break;
}
used[v]=true;//把顶点v加人X
res+=mincost[v];//把边的长度加到结果里
for(int u=0;u<V;u++)
{
mincost[u]=min(mincost[u],cost[v][u]);
}
}
//printf("%d",res);
cout<<res<<endl;
}
return 0;
}
N个农场,使用光纤连接,求连接所有农场的最小成本。给出邻接矩阵,Aij(i>0,j>0)的值表示农场i到农场j使用光纤连接的成本。