http://acm.hdu.edu.cn/showproblem.php?pid=1102
并查集
我的代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 const int N=110;
4 struct edge
5 {
6 int u,v,w;
7 }e[N*N];
8 int a[N][N],set[N];
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 int n,i,j,m,q,u,v,ans,fx,fy;
20 while (scanf("%d",&n)!=EOF)
21 {
22 ans=m=0;
23 for (i=1;i<=n;i++) set[i]=i;
24 for (i=1;i<=n;i++)
25 for (j=1;j<=n;j++) scanf("%d",&a[i][j]);
26 for (i=1;i<=n;i++)
27 for (j=1;j<i;j++)
28 {
29 m++;
30 e[m].u=i; e[m].v=j; e[m].w=a[i][j];
31 }
32 scanf("%d",&q);
33 while (q--)
34 {
35 scanf("%d%d",&u,&v);
36 set[find(u)]=find(v);
37 }
38 qsort(e+1,m,sizeof(e[0]),cmp);
39 for (i=1;i<=m;i++)
40 {
41 fx=find(e[i].u);
42 fy=find(e[i].v);
43 if (fx==fy) continue;
44 ans+=e[i].w;
45 set[fx]=fy;
46 }
47 printf("%d\n",ans);
48 }
49 }