[kuangbin带你飞]专题六 最小生成树 G - Arctic Network

深藏阁楼爱情的钟 2023-08-17 15:41 233阅读 0赞

G - Arctic Network

题目链接:https://vjudge.net/contest/66965#problem/G

题目:

**国防部(DND)希望通过无线网络连接几个北部前哨站。在建立网络时将使用两种不同的通信技术:每个前哨站都有一个无线电收发器,一些前哨站还有一个卫星信道。
任何带卫星频道的两个前哨站都可以通过卫星进行通信,无论其位置如何。否则,两个前哨只有当它们之间的距离不超过D时才可以通过无线电进行通信,这取决于收发器的功率。更高的功率产生更高的D但成本更高。由于采购和维护考虑,前哨的收发器必须相同;也就是说,每对前哨的D值都是相同的。

  1. 您的工作是确定收发器所需的最小D。每对前哨之间必须至少有一条通信路径(直接或间接)。

输入
第一行输入包含N,即测试用例的数量。每个测试用例的第一行包含1 <= S <= 100,卫星信道的数量,并且S <P <= 500,即前哨的数量。 P线跟随,给出每个前哨的(x,y)坐标,单位为km(坐标为0到10,000之间的整数)。
产量
对于每种情况,输出应由一条线组成,给出连接网络所需的最小D.输出应指定为2个小数点。
样本输入

  1. 1
  2. 2 4
  3. 0 100
  4. 0 300
  5. 0 600
  6. 150 750

样本输出

  1. 212.13**

思路:s个通信工具,p个点,先求最小生成树,然后用数组cun[]把最小生成树的每个边存起来,由于求最小的D,所以s个通信工具用给最长的s个边,其余的就要用到无线电收发器了,故输出cun[p-s-1]即可,由于下标从0开始,所以减一,还有数组不要开小了,会wa。

  1. //
  2. // Created by hanyu on 2019/7/31.
  3. //
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <cstdio>
  7. #include <cstring>
  8. #include <queue>
  9. #include <set>
  10. #include <math.h>
  11. using namespace std;
  12. typedef long long ll;
  13. const int maxn=2e5+10;
  14. struct Node{
  15. int u,v;
  16. double w;
  17. bool operator<(const Node &other)const{
  18. return this->w<other.w;
  19. }
  20. }node[maxn];
  21. int father[maxn];
  22. double cun[maxn];
  23. int find(int x)
  24. {
  25. if(x==father[x])
  26. return x;
  27. return father[x]=find(father[x]);
  28. }
  29. double len(double x1,double x2,double y1,double y2)
  30. {
  31. return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  32. }
  33. int main()
  34. {
  35. int T;
  36. scanf("%d",&T);
  37. while(T--)
  38. {
  39. int n,m;
  40. scanf("%d%d",&n,&m);
  41. double xx[maxn],yy[maxn];
  42. for(int i=0;i<=m;i++)
  43. father[i]=i;
  44. memset(cun,0,sizeof(cun));
  45. for(int i=1;i<=m;i++)
  46. {
  47. scanf("%lf%lf",&xx[i],&yy[i]);
  48. }
  49. int cnt=0;
  50. for(int i=1;i<m;i++)
  51. {
  52. for(int j=i+1;j<=m;j++)
  53. {
  54. double p=len(xx[i],xx[j],yy[i],yy[j]);
  55. node[cnt].u=i;
  56. node[cnt].v=j;
  57. node[cnt++].w=p;
  58. }
  59. }
  60. sort(node,node+cnt);
  61. int book=0;
  62. for(int i=0;i<cnt;i++)
  63. {
  64. int uu=find(node[i].u);
  65. int vv=find(node[i].v);
  66. if(uu==vv)
  67. continue;
  68. else
  69. {
  70. father[uu]=vv;
  71. cun[book++]=node[i].w;
  72. }
  73. }
  74. printf("%.2f\n",cun[m-n-1]);
  75. }
  76. return 0;
  77. }

转载于:https://www.cnblogs.com/Vampire6/p/11279848.html

发表评论

表情:
评论列表 (有 0 条评论,233人围观)

还没有评论,来说两句吧...

相关阅读