畅通project再续

Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其它的小岛时都要通过划小船来实现。

如今政府决定大力发展百岛湖。发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!

经过考察小组RPRush对百岛湖的情况充分了解后。决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。

当然,为了节省资金。仅仅要求实现随意2个小岛之间有路通就可以。当中桥的价格为 100元/米。

 
Input
输入包含多组数据。输入首先包含一个整数T(T <= 200),代表有T组数据。

每组数据首先是一个整数C(C <= 100),代表小岛的个数。接下来是C组坐标。代表每一个小岛的坐标。这些坐标都是 0 <= x, y <= 1000的整数。
 
Output
每组输入数据输出一行,代表建桥的最小花费。结果保留一位小数。假设无法实现project以达到所有畅通,输出”oh!”.
 
Sample Input
  1. 2
  2. 2
  3. 10 10
  4. 20 20
  5. 3
  6. 1 1
  7. 2 2
  8. 1000 1000
 
Sample Output
  1. 1414.2
  2. oh!
 
Author
8600
 
Source
 



AC代码:

kruskal:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int per[111];
  7. double x[111],y[111];
  8. struct node{
  9. int start,end;
  10. double distance;
  11. };
  12. node p[10000];
  13. int cmp(node a,node b) //距离从小到大
  14. {
  15. return a.distance < b.distance;
  16. }
  17. void init()
  18. {
  19. for(int i = 1;i < 111;i++ )
  20. per[i] = i;
  21. }
  22. int find(int x)
  23. {
  24. if(x == per[x])
  25. return x;
  26. return per[x] = find(per[x]);
  27. }
  28. bool join(int x,int y)
  29. {
  30. int fx = find(x);
  31. int fy = find(y);
  32. if(fx != fy) //推断是否成环
  33. {
  34. per[fx] = fy;
  35. return true; //没成环
  36. }
  37. return false;
  38. }
  39. int main()
  40. {
  41. int i,j,k;
  42. int t,n,c;
  43. double d,cost; //一定要注意题目所要求的数据类型
  44. scanf("%d",&t);
  45. while(t--)
  46. {
  47. init();
  48. scanf("%d",&c);
  49. for(i = 1;i <= c; i++)
  50. {
  51. scanf("%lf%lf",&x[i], &y[i]);
  52. }
  53. k = 0;
  54. for(i = 1;i <= c;i++)
  55. {
  56. for(j = i+1;j <= c;j++)
  57. {
  58. d = sqrt( (x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]) );//距离公式
  59. if(d >=10.0 && d <= 1000.0) //一定要筛选完再存进结构体 要不然会WA.
  60. {
  61. p[k].start = i; //起点
  62. p[k].end = j; //终点
  63. p[k].distance = d;//起点到到终点的距离
  64. k++;
  65. }
  66. }
  67. }
  68. sort(p,p+k,cmp); //按距离从小到大排序
  69. int num = 0;
  70. cost = 0.0;
  71. for( i = 0;i < k; i++)
  72. {
  73. if(join(p[i].start, p[i].end))
  74. cost += p[i].distance;
  75. }
  76. for( i = 1;i <= c;i++ )
  77. {
  78. if(per[i]==i)
  79. num++;
  80. if(num > 1) // 及时跳出循环节省时间
  81. break;
  82. }
  83. if(num>1) //无法连接全部小岛
  84. printf("oh!\n");
  85. else
  86. printf("%.1lf\n",100*cost);
  87. }
  88. return 0;
  89. }



===============================切割线======================================

prim:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #define mem(a, b) memset(a, (b), sizeof(a))
  5. #define Wi(a) while(a--)
  6. #define Si(a) scanf("%d", &a)
  7. #define Pi(a) printf("%d\n", (a))
  8. #define Pf(a) printf("%.1lf\n", (a))
  9. #define INF 0x3f3f3f
  10. double map[150][150];
  11. int x[150],y[150];
  12. int n;
  13. double d[150], vis[150];
  14. void prim()
  15. {
  16. mem(vis, 0);
  17. int i, j, k;
  18. double ans = 0, minn;
  19. for(i = 1; i <= n; i++)
  20. d[i] = map[1][i];
  21. vis[1] = 1;
  22. for(i = 1; i < n; i++)
  23. {
  24. k = 1;
  25. minn = INF;
  26. for(j = 1; j <= n; j++)
  27. {
  28. if(!vis[j] && d[j] < minn)
  29. {
  30. minn = d[j];
  31. k = j;
  32. }
  33. }
  34. if(minn == INF){
  35. puts("oh!");return;
  36. }
  37. vis[k] = 1;
  38. ans += minn;
  39. for(j = 1; j <= n; j++)
  40. {
  41. if(!vis[j] && d[j] > map[j][k])
  42. d[j] = map[j][k];
  43. }
  44. }
  45. Pf(ans*100);
  46. }
  47. int main(){
  48. int t; Si(t);
  49. Wi(t){
  50. Si(n);
  51. int i , j, k;
  52. for(i = 1; i <= n; i++)
  53. {
  54. scanf("%d%d", &x[i], &y[i]);
  55. }
  56. for(i = 1; i <= n; i++)
  57. {
  58. for(j = 1; j <= n; j++)
  59. {
  60. double d = sqrt( (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));
  61. if(d >= 10.0 && d <= 1000.0)
  62. map[i][j] = map[j][i] = d;
  63. else
  64. map[i][j] = map[j][i] = INF;
  65. }
  66. map[i][i] = 0;
  67. }
  68. prim();
  69. }
  70. return 0;
  71. }



hdoj 1875 畅通project再续【最小生成树 kruskal &amp;&amp; prim】的更多相关文章

  1. hdu 1875 畅通project再续(kruskal算法计算最小生成树)

    畅通project再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. HDU 1875 畅通工程再续 (最小生成树)

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. HDU 1875 畅通project再续 (最小生成树 水)

    Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其它的小岛时都要通过划小船来实现. 如今政府决定大力发展百岛 ...

  4. Hdoj 1875.畅通工程再续 题解

    Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖 ...

  5. hdoj 1875 畅通工程再续

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1875 //9403289 2013-10-24 17:00:49 Accepted 1875 62M ...

  6. (step6.1.3)hdu 1875(畅通工程再续——最小生成树)

    题目大意:本题是中文题,可以直接在OJ上看 解题思路:最小生成树 1)本题的关键在于把二维的点转化成一维的点 for (i = 0; i < n; ++i) { scanf("%d%d ...

  7. hdu 1875 畅通project再续

    链接:hdu 1875 输入n个岛的坐标,已知修桥100元/米,若能n个岛连通.输出最小费用,否则输出"oh!" 限制条件:2个小岛之间的距离不能小于10米,也不能大于1000米 ...

  8. hdu1875 畅通工程再续 最小生成树并查集解决---kruskal

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  9. HDU 1875 畅通工程再续 (最小生成树)

    畅通工程再续 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/M Description 相信大家都听说一个"百岛湖&q ...

随机推荐

  1. 算法复习——网络流模板(ssoj)

    题目: 题目描述 有 n(0<n<=1000)个点,m(0<m<=1000)条边,每条边有个流量 h(0<=h<35000),求从点 start 到点 end 的最 ...

  2. TeraTerm设定(窗体大小,字体字号)保存为默认值

    Tera Term是一款很好的SSH工具,大家经常遇到一个头疼的问题,每次打开的时候,都要自己重新设置一遍Font. 介绍一下把自己喜欢的字体,设置好后,保存到默认配置中的方法. 设置窗体大小: 设置 ...

  3. P1857 质数取石子 (DP,递推)

    题目描述 桌上有若干个石子,每次可以取质数个.谁先取不了,谁就输.问最少几步能赢?(一个人取一次算一步) 输入输出格式 输入格式: 第一行N,表示有N组数据 接下来N行为石子数 输出格式: 每组数据一 ...

  4. 【bzoj2393】Cirno的完美算数教室 数论容斥

    Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数 ...

  5. cf711E ZS and The Birthday Paradox

    ZS the Coder has recently found an interesting concept called the Birthday Paradox. It states that g ...

  6. jmeter监控linux cpu 内存 网络 IO

    下载地址:http://jmeter-plugins.org/downloads/all/ PerfMon: 用来监控Server的CPU.I/O.Memory等情况 ServerAgent-2.2. ...

  7. 家用电脑架服务器提供web

    要搞一个可以对外的web服务,需要服务器,域名.这些都需要money,但有时,我们只是想自己可以在外面访问,或是提供给朋友看自己的网站有多牛.这时使用家用电脑配置一个可以提供web的服务器,就显得很必 ...

  8. hdu 5288 ZCC loves straight flush

    传送门 ZCC loves straight flush Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K ...

  9. ORA-01033: ORACLE initialization or shutdown in progress问题

    这是Oracle12c中笔者遇到的一个错误提示:ORA-01033: ORACLE initialization or shutdown in progress 错误的中文意思是:Oracle初始化未 ...

  10. IntelliJ IDE 各种插件的安装和使用

    插件的安装和使用持续的更新中...........................................................