畅通工程再续

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21693    Accepted Submission(s): 6856

Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
 
Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
 
Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
 
Sample Input
2
2
10 10
20 20
3
1 1
2 2
1000 1000
 
Sample Output
1414.2
oh!
思路:首先利用并查集判断所有坐标是否能构成一个连通图。若是一个连通图则直接求最小生成树。
  1. #include<cstdio>
  2. #include<cmath>
  3. #include<vector>
  4. #include<queue>
  5. using namespace std;
  6. const int MAXN=;
  7. const double INF=1.0e9;
  8. typedef pair<double,int> P;
  9. struct Point{
  10. int x,y;
  11. }ps[MAXN];
  12. int V;
  13. vector<int> G[MAXN];
  14. double mp[MAXN][MAXN];
  15. int par[MAXN];
  16. int rnk[MAXN];
  17. double dist(int x1,int y1,int x2,int y2)
  18. {
  19. return sqrt(double((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
  20. }
  21.  
  22. void prep(int n)
  23. {
  24. for(int i=;i<=n;i++)
  25. {
  26. par[i]=i;
  27. rnk[i]=;
  28. }
  29. }
  30.  
  31. int fnd(int x)
  32. {
  33. if(par[x]==x)
  34. return x;
  35. return par[x]=fnd(par[x]);
  36. }
  37.  
  38. void unite(int x,int y)
  39. {
  40. int a=fnd(x);
  41. int b=fnd(y);
  42. if(a==b)
  43. {
  44. return ;
  45. }
  46. if(rnk[a]<rnk[b])
  47. {
  48. par[a]=b;
  49. }
  50. else
  51. {
  52. par[b]=a;
  53. if(rnk[a]==rnk[b]) rnk[a]++;
  54. }
  55. }
  56.  
  57. bool judge(int n)
  58. {
  59. int f=fnd();
  60. for(int i=;i<=n;i++)
  61. if(f!=par[i]) return false;
  62. return true;
  63. }
  64.  
  65. double d[MAXN];
  66. int vis[MAXN];
  67. double prim(int s)
  68. {
  69. double ans=;
  70. for(int i=;i<=V;i++)
  71. {
  72. d[i]=INF;
  73. vis[i]=;
  74. }
  75. d[s]=;
  76. priority_queue<P,vector<P>,greater<P> > que;
  77. que.push(P(,s));
  78.  
  79. while(!que.empty())
  80. {
  81. P now=que.top();que.pop();
  82. int v=now.second;
  83. if(vis[v]) continue;
  84. ans+=now.first;
  85. vis[v]=;
  86. for(int i=;i<G[v].size();i++)
  87. {
  88. int to=G[v][i];
  89. if(d[to]>mp[v][to])
  90. {
  91. d[to]=mp[v][to];
  92. que.push(P(d[to],to));
  93. }
  94. }
  95. }
  96. return ans;
  97. }
  98.  
  99. int main()
  100. {
  101. int T;
  102. scanf("%d",&T);
  103. while(T--)
  104. {
  105. scanf("%d",&V);
  106. prep(V);
  107. for(int i=;i<=V;i++)
  108. for(int j=;j<=V;j++)
  109. if(i==j) mp[i][j]=;
  110. else mp[i][j]=INF;
  111. for(int i=;i<=V;i++)
  112. {
  113. scanf("%d%d",&ps[i].x,&ps[i].y);
  114. }
  115. for(int i=;i<=V;i++)
  116. for(int j=i+;j<=V;j++)
  117. {
  118. double co=dist(ps[i].x,ps[i].y,ps[j].x,ps[j].y);
  119. if(co<||co>) continue;
  120. mp[i][j]=mp[j][i]=co;
  121. G[i].push_back(j);
  122. G[j].push_back(i);
  123. unite(i,j);
  124. }
  125. if(judge(V))
  126. {
  127. double ans=prim();
  128. printf("%0.1lf\n",ans*);
  129. }
  130. else
  131. {
  132. printf("oh!\n");
  133. }
  134. }
  135.  
  136. return ;
  137. }

HDU1875(最小生成树)的更多相关文章

  1. HDU1875——畅通工程再续(最小生成树:Kruskal算法)

    畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...

  2. hdu1875(最小生成树prime)

    思路:一开始想用贪心来着,发现贪心有缺陷,然后就用了最小生成树来写,这里用了prime算法,首先,先建个图,两点之间的边的权值就是两个点的距离,然后直接prime模板 代码 #include<i ...

  3. HDU1875 畅通工程再续【最小生成树】

    题意: 在这些小岛中建设最小花费的桥,但是一座桥的距离必须在10 -- 1000之间. 思路: 用最小生成树解决吧,就那两个算法. 代码: prim #include <iostream> ...

  4. hdu1875 畅通工程再续 并查集/最小生成树

    相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全 ...

  5. HDU-1875 畅通工程再续(最小生成树+判断是否存在)

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 Problem Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛 ...

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

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

  7. hdu1875 畅通工程再续 暴力+基础最小生成树

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; ; ; in ...

  8. HDU1875+Prim模板

    https://cn.vjudge.net/problem/HDU-1875 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府 ...

  9. 最小生成树(Kruskal算法-边集数组)

    以此图为例: package com.datastruct; import java.util.Scanner; public class TestKruskal { private static c ...

随机推荐

  1. request 请求转发

    package request; import java.io.IOException;import javax.servlet.ServletException;import javax.servl ...

  2. Spark源码分析之四:Stage提交

    各位看官,上一篇<Spark源码分析之Stage划分>详细讲述了Spark中Stage的划分,下面,我们进入第三个阶段--Stage提交. Stage提交阶段的主要目的就一个,就是将每个S ...

  3. Android 音频 OpenSL ES 录音 采集

    1,; int channelConfig = AudioFormat.CHANNEL_OUT_STEREO; int audioFormat = AudioFormat.ENCODING_PCM_1 ...

  4. 【转】一步一步带你反编译apk,并教你修改smali和重新打包

    一.工具介绍: 1.apktool:aapt.exe,apktool.bat,apktool.jar;三个在同一目录结合使用,用来反编译apk,apk重新打包: 2.dex2jar:该工具作用是将cl ...

  5. CentOS6.5升级内核从2.6.32到3.2.14

    由于最近想要在服务器上跑IOU,但是在部署VMware后发现不能正常启动,总是提示内核无法载入,什么C header files matching your running kernel were n ...

  6. Nested Classes

    http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html package priceton; /* * Copyright (c) ...

  7. 使用cocos2d-js-3.0RC1中的物理引擎chipmunk模拟的“别碰钉子”源码分享(含碰撞检测)

    分别用box2d和chipmunk实现了一下,不过box2d没整理,也懒得整理了.chipmunk整理了一下,分享给大家吧. 刚开始研究,抛砖引玉 简要说明:1.初始化物理环境,增加边界 initPh ...

  8. iOS 10 权限配置大全

    <!-- 相册 --> <key>NSPhotoLibraryUsageDescription</key> <string>App需要您的同意,才能访问 ...

  9. HDU 5247 找连续数 (set妙用)

    找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  10. 使用appium和testng实现Android自动截图

    简单介绍 需求场景是:当测试安卓应用的脚本得到失败结果时,对当前手机屏幕截图,便于查找问题. 实现方式是:1)定义一个父类UITest,作为所有测试类的父类.在父类中UITest中定义一个截图的方法, ...