//Kruskal + 并查集 #include<iostream> #include<algorithm> using namespace std; int fa[101];//父亲指针数组 int G[105][105];//图 int n,e;//点数和边数 struct edge//存放边的结构体 { int u; int v; int w; }E[5000]; bool cmp(edge a,edge b) //对边权进行排序的排序比较函数 { return a.w < b.w; } int getfather(int x)//取得父亲函数 { return fa[x] == x ? x : fa[x] = getfather(fa[x]); } int Kruskal(int e) { int ans = 0; for(int i = 0;i < n;++i) fa[i] = i; sort(E,E+e,cmp); for(int i = 0;i < e;++i) { int x = getfather(E[i].u); int y = getfather(E[i].v); if(x != y) { ans += E[i].w; fa[x] = y; } } return ans; } int main() { //freopen("in.txt","r",stdin); while(scanf("%d",&n) != EOF) { for(int i = 0;i < n;++i) for(int j = 0;j < n;++j) scanf("%d",&G[i][j]); int e = 0; for(int i = 0;i < n-1;++i) { for(int j = i+1;j < n;++j) { E[e].u = i; E[e].v = j; E[e++].w = G[i][j]; } }//读边 printf("%d/n",Kruskal(e)); } return 0; }