http://acm.hdu.edu.cn/showproblem.php?pid=1879
并查集
我的代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 const int M=10000,N=110;
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 main()
18 {
19 while (scanf("%d",&n) && n)
20 {
21 m=0;
22 int uu,vv,ww,f,mm;
23 mm=n*(n-1)/2;
24 for (int i=1;i<=n;i++) set[i]=i;
25 for (int i=1;i<=mm;i++)
26 {
27 scanf("%d%d%d%d",&uu,&vv,&ww,&f);
28 if (f) set[find(uu)]=find(vv);
29 else
30 {
31 m++;
32 e[m].u=uu;
33 e[m].v=vv;
34 e[m].w=ww;
35 }
36 }
37 int ans=0;
38 qsort(e+1,m,sizeof(e[0]),cmp);
39 for (int i=1;i<=m;i++)
40 {
41 int x=find(e[i].u);
42 int y=find(e[i].v);
43 if (x!=y) {ans+=e[i].w; set[x]=y;}
44 }
45 printf("%d\n",ans);
46 }
47 }