http://acm.hdu.edu.cn/showproblem.php?pid=1233
赤裸裸的最小生成树
Kruskal
我的代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 const int M=10000,N=100;
4 struct edge
5 {
6 int u,v,w;
7 }e[M];
8 int set[N],n,m;
9 int cmp(const void *a,const void *b)
10 {
11 return ((edge*)a)->w - ((edge*)b)->w;
12 }
13 int find(int x)
14 {
15 return set[x]==x ? x : set[x]=find(set[x]);
16 }
17 int kruskal()
18 {
19 int i,ans=0;
20 for (i=1;i<=n;i++) set[i]=i;
21 qsort(e+1,m,sizeof(e[0]),cmp);
22 for (i=1;i<=m;i++)
23 {
24 int x=find(e[i].u);
25 int y=find(e[i].v);
26 if (x!=y) {ans+=e[i].w; set[x]=y;}
27 }
28 return ans;
29 }
30 int main()
31 {
32 while (scanf("%d",&n) && n)
33 {
34 m=n*(n-1)/2;
35 for (int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
36 printf("%d\n",kruskal());
37 }
38 return 0;
39 }