HDU 3371 Connect the Cities 最小生成树(和关于sort和qsort的一些小发现)

解题报告:有n个点,然后有m条可以添加的边,然后有一个k输入,表示一开始已经有k个集合的点,每个集合的点表示现在已经是连通的了。

还是用并查集加克鲁斯卡尔。只是在输入已经连通的集合的时候,通过并查集将该集合的点标记到一起,然后剩下的就可以当成是普通的最小生成树来做了题目代码如下:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 using namespace std;
 7 
 8 struct node
 9 {
10     int front ,rear,cost;
11 }rode[25005];
12 int pre[505];
13 int find(int n)
14 {
15     return pre[n] == n? n:pre[n] = find(pre[n]);
16 }
17 int cmp(const void *a,const void *b)
18 {
19     return (*(node*)a).cost <= (*(node*)b).cost? -1:1;
20 }
21 int judge(int n)
22 {
23     for(int i = 2;i <= n;++i)
24     if(find(1) != find(i))
25     return 0;
26     return 1;
27 }
28 
29 int main()
30 {
31     int T;
32     int ci,s,d;
33     scanf("%d",&T);
34     while(T--)
35     {
36         int n,m,k;
37         scanf("%d%d%d",&n,&m,&k);
38         for(int i = 1;i <= m;++i)
39         scanf("%d%d%d",&rode[i].front,&rode[i].rear,&rode[i].cost);
40         qsort(rode+1,m,sizeof(node),cmp);
41         for(int i = 1;i <= n;++i)
42         pre[i] = i;
43         while(k--)
44         {
45             scanf("%d%d",&ci,&s);
46             ci--;
47             while(ci--)
48             {
49                 scanf("%d",&d);
50                 pre[find(s)] = find(d);
51             }
52         }
53         int ans = 0;
54         for(int i = 1;i <= m;++i)
55         {
56             int temp1 = find(rode[i].front);
57             int temp2 = find(rode[i].rear);
58             if(temp1 != temp2)
59             {
60                 ans += rode[i].cost;
61                 pre[temp1] = temp2;
62             }
63         }
64         printf(judge(n)? "%d
":"-1
",ans);
65     }
66     return 0;
67 }
View Code


 

不过,我过这道题的时候发现一个小问题,就是在排序的时候用sort总会T,但是发现改成qsort之后,比原来快了很多,然后就A了。经过一些测试发现,qsort在数据量比较大的时候要比sort更快,而且数据量越大,差别越大,下面再附上测试用的代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<time.h>
 5 using namespace std;
 6 
 7 const int maxn = 100000;
 8 
 9 int que[maxn];
10 
11 int cmp(const void *a,const void *b)
12 {
13     return (*(int*)a) <= (*(int*)b)? -1:1;
14 }
15 bool comp(int a,int b)
16 {
17     return a <= b;
18 }
19 int main()
20 {
21     for(int i = maxn - 1;i >=0;--i)
22     que[i] = i;
23     int s = clock();
24     qsort(que,maxn,sizeof(int),cmp);
25     int e = clock();
26     printf("t_qsort = %d
",e - s);
27     s = clock();
28     sort(que,que+maxn,comp);
29     e = clock();
30     printf("t_sort = %d
",e - s);
31     return 0;
32 }    
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3565487.html