题目链接: http://acm.pku.edu.cn/JudgeOnline/problem?id=1258 #include <stdio.h> #include <algorithm> #define MAX_V 100 //并查集 int parent[MAX_V]; int rank[MAX_V]; //生成一个单元素集合 void make_set(int x){ parent[x] = x; rank[x] = 0; } //返回一个包含x的集合的代表,也就是树根节点 int find_set(int x){ if(x != parent[x]) parent[x] = find_set(parent[x]); return parent[x]; } //按秩合并x,y所在的集合. void union_set(int x,int y){ x = find_set(x); y = find_set(y); if(x == y) return; if(rank[x] > rank[y]) parent[y] = x; else{ parent[x] = y; if(rank[x] == rank[y]) rank[y]++; } } struct Edge{ int u; int v; int cost; }edges[MAX_V * (MAX_V - 1) / 2]; //边按权重非递减排序 int cmp(const void * e1,const void * e2){ return ((Edge *)e1)->cost - ((Edge *)e2)->cost; } int edge_num; int minimum; void Kruskal(){ minimum = 0; int u,v; for(int i = 0;i < edge_num;i++){ u = find_set(edges[i].u); v = find_set(edges[i].v); if(u != v){ union_set(u,v); minimum += edges[i].cost; } } } int main(){ int N; int i,j; int w; while(scanf("%d",&N) != EOF){ edge_num = 0; for(i = 0;i < N;i++) for(j = 0;j < N;j++){ scanf("%d",&w); if(i < j){ edges[edge_num].u = i; edges[edge_num].v = j; edges[edge_num].cost = w; edge_num++; } } qsort(edges,edge_num,sizeof(Edge),cmp); for(i = 0;i < N;i++) make_set(i); Kruskal(); printf("%d/n",minimum); } return 0; }