直接贴代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 105;
struct node{
int u,v,w;
node(){}
node(int _u,int _v,int _w){
u = _u; v = _v; w = _w;
}
bool operator<(const node &p)const{
return w < p.w;
}
}edge[10010];
int G[maxn][maxn];
int n,sume;
int fa[maxn];
int find(int x){ // 并查集
return x==fa[x]?x:(fa[x]=find(fa[x]));
}
int main()
{
while(scanf("%d",&n) == 1){
int i,j;
for(i=1; i<=n; i++) fa[i] = i;
sume = 0;
for(i=1; i<=n; i++) for(j=1; j<=n; j++){
scanf("%d",&G[i][j]);
if(i < j)
edge[sume++] = node(i,j,G[i][j]);
}
int ans = 0;
sort(edge,edge+sume);
for(i=0; i<sume; i++){
int u,v,w,fu,fv;
u = edge[i].u; v = edge[i].v; w = edge[i].w;
fu = find(u); fv = find(v);
if(fu != fv){
ans += w;
fa[fu] = fv;
}
}
printf("%d\n",ans);
}
return 0;
}