zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    《Effective C++》笔记
    《C++ Qt 编程视频教程》
    Windows下802.11抓包
    springcloud01_ribbon使用及原理
    springboot04_springboot特性之Actuator
    springboot04_手写实现starter实现
    linux操作01_redis服务器安装
    springboot03_核心特性及设计思想
    springboot重新认识
    springboot01_微服务架构的现状及未来【上】
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3565487.html
Copyright © 2011-2022 走看看