1751 Highways 解题报告

AccecptTime:             2008-12-20 16:37:39

Language:                C++
Memory:                  3516K
Time:                    485MS + 969MS
Errors:                  6 TL + 1 CE + 1 ML
Algorithm:               Kruskal + sort + 并查集

 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. #include <algorithm>
  5. using namespace std;
  6. #define Lenght(i,j) (town[i].x - town[j].x) * (town[i].x - town[j].x) + (town[i].y - town[j].y) * (town[i].y - town[j].y)
  7. #define N 751
  8. typedef struct Town
  9. {
  10.     int x;
  11.     int y;
  12. }Town;
  13. Town town[N];
  14. typedef struct Edge 
  15. {
  16.     int x;
  17.     int y;
  18.     int lenght;
  19. //重载的 " () "用于sort()
  20. bool operator () ( const Edge &a, const Edge &b ) const 
  21. {
  22.     if(a.lenght < b.lenght)
  23.         return true;
  24.     return false;
  25. }
  26. } Edge;
  27. /* 当使用qsort()的时候用
  28. int cmp(const void*a,const void*b)
  29. {
  30.     return ((Edge*)a)->lenght - ((Edge*)b)->lenght;
  31. }
  32. */
  33. Edge edge[ N * N / 2 + N];
  34. int parent[N];
  35. int FindParent(int x)
  36. {
  37.     if(parent[x] > 0) {
  38.         parent[x] = FindParent(parent[x]);
  39.         return parent[x];
  40.     }
  41.     return x;
  42. }
  43. void MergeSet(int x,int y)
  44. {
  45.     x = FindParent(x);
  46.     y = FindParent(y);
  47.     // 有路重复出现的可能
  48.     if( x == y)
  49.         return ;
  50.     if(parent[x] < parent[y]) 
  51.         parent[y] = x;
  52.     else {
  53.         if( parent[x] == parent[y]) {
  54.             parent[y] --;
  55.             parent[x] = y;
  56.         }
  57.         else
  58.             parent[x] = y;
  59.     }
  60. }
  61. int main()
  62. {
  63.     int n, count;
  64.     count = 0;
  65.     scanf("%d",&n);
  66.     for ( int i = 1; i <= n; i++)
  67.         scanf("%d%d",&town[i].x,&town[i].y);
  68.     forint i = 1; i < n; i++)
  69.         forint j = i + 1; j <= n; j++) {
  70.             edge[count].x = i;
  71.             edge[count].y = j;
  72.             edge[count++].lenght = Lenght(i,j);
  73.         }
  74. // 事实证明:qsort 比 sort 效率低
  75. //  qsort(edge,count,sizeof(Edge),cmp);
  76.     sort(edge,edge+count,Edge());
  77.     int m,x,y;
  78.     scanf("%d",&m);
  79.     forint i = 0; i < m; i ++) {
  80.         scanf("%d%d",&x,&y);
  81.         MergeSet(x,y);
  82.     }
  83.     forint i = 0; i < count; i++)
  84.         if( FindParent(edge[i].x) != FindParent(edge[i].y)) {
  85.             printf("%d %d/n",edge[i].x,edge[i].y);
  86.             MergeSet(edge[i].x,edge[i].y);
  87.             n--;
  88.         }
  89. }

这题与上一题基本一样,下午ac了2421后,这题就变得信手拈来了~我提交了3次,第一次用的是sort,第二次用的是qsort发现qsort慢了sort不止一倍!于是提交第三次,用的是sort,原来qsort真的比sort慢,而且慢这么多。。。以后不用qsort了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值