码迷,mamicode.com
首页 > 其他好文 > 详细

P1991 无线通讯网

时间:2018-11-08 20:49:34      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:++i   add   str   sqrt   统一   通话   ace   space   std   

收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个 D。你的任务是确定收发器必须的最小通话距离 D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。

最小瓶颈路好吧

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 const int maxm=500000;
 7 struct edge{
 8     int u,v;
 9     double w;
10 }e[maxm];
11 int fa[maxm],cnt;
12 double dis[maxm];
13 void add(int u,int v,double w)
14 {
15     e[++cnt].u=u;
16     e[cnt].v=v;
17     e[cnt].w=w;
18 }
19 int cmp(edge p,edge q)
20 {
21     return p.w<q.w;
22 }
23 int find(int x)
24 {
25     if(x!=fa[x]) fa[x]=find(fa[x]);
26     return fa[x];
27 }
28 int a[maxm],b[maxm];
29 double c[maxm];
30 int main()
31 {
32     int n,m,num=0;
33     scanf("%d%d",&n,&m);
34     for(int i=1,x,y;i<=m;++i)
35     {
36         scanf("%d%d",&a[i],&b[i]);
37     }
38     for(int i=1;i<=m;++i) fa[i]=i;
39     for(int i=1;i<=m;++i)
40     {
41         for(int j=1;j<=m;++j)
42         {
43             if(i!=j)
44             {
45                 double s=(double)sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]));
46                 add(i,j,s);
47             }
48         }
49     }
50     sort(e+1,e+cnt+1,cmp);
51     for(int i=1;i<=cnt;++i)
52     {
53         int r1=find(e[i].u),r2=find(e[i].v);
54         if(r1!=r2)
55         {
56             fa[r1]=r2;
57             c[++num]=e[i].w;
58         }
59     }
60     sort(c+1,c+num+1);
61     printf("%.2lf",c[num-n+1]);
62     return 0;
63 }

 

P1991 无线通讯网

标签:++i   add   str   sqrt   统一   通话   ace   space   std   

原文地址:https://www.cnblogs.com/zytwan/p/9931775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!