标签:++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 }
标签:++i add str sqrt 统一 通话 ace space std
原文地址:https://www.cnblogs.com/zytwan/p/9931775.html