代码留存:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int maxn = 100 + 5;
const int INF = 1000000000;
int M[maxn][maxn];
int n;
priority_queue<P,vector<P>,greater<P> > Q;
int vis[maxn];
int prim(){
int ret = 0;
memset(vis,0,sizeof(vis));
while(!Q.empty()) Q.pop();
Q.push(P(0,0));
while(!Q.empty()){
P p = Q.top();Q.pop();
if(vis[p.second] == 1) continue;
vis[p.second] = 1;
ret += p.first;
for(int i = 0;i < n;i++){
if(vis[i] == 0){
Q.push(P(M[p.second][i],i));
}
}
}
return ret;
}
/*int mincost[maxn];
bool used[maxn];
int prim(){
for(int i = 0;i < n;i++){
mincost[i] = INF;
used[i] = false;
}
mincost[0] = 0;
int res = 0;
while(1){
int v = -1;
for(int u = 0;u < n;u++){
if(!used[u] && (v==-1 || mincost[u] < mincost[v])) v = u;
}
if(v == -1) break;
used[v] = true;
res += mincost[v];
for(int u = 0;u < n;u++){
mincost[u] = min(mincost[u],M[v][u]);
}
}
return res;
}*/
int main(){
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
scanf("%d",&M[i][j]);
}
}
printf("%d\n",prim());
}
return 0;
}