【题目描述】
国防部计划用无线网络连接若干个边防哨所。2种不同的通讯技术用来搭建无线网络;每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。
任意两个配备了一条卫星电话线路的哨所(两边都拥有卫星电话)均可以通话,无论他们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过D,这是受收发器的功率限制。收发器的功率越高,通话距离D会更远,但同时价格也会更贵。
收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个D。
你的任务是确定收发器必须的最小通话距离D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。
【输入格式】 wireless.in
第1行:2个整数S(1<=S<=100)和P(S<P<=500),S表示可安装的卫星电话的哨所数,P表示边防哨所的数量。
接下里P行,每行描述一个哨所的平面坐标(x,y),以km为单位,整数,0<=x,y<=10000。
【输出格式】 wireless.out
第1行:1个实数D,表示无线电收发器的最小传输距离。精确到小数点后两位。
【样例输入】
2 4
0 100
0 300
0 600
150 750
【样例输出】
212.13
数据范围
对于20%的数据 P=2,S=1
对于另外20%的数据 P=4,S=2
对于100%的数据 1<=S<=100,S<P<=500
kruskal最小生成树
题解:
用vector容器储存最大值
有几个卫星电话,就取倒数第几个最大值
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 8 struct Edge 9 { 10 int u,v; 11 double w; 12 }E[300000]; 13 int F[501]; 14 15 vector<double> ans; 16 17 int s,p,node=0,x[501],y[501]; 18 19 int read() 20 { 21 int x=0,f=1;char ch=getchar(); 22 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-f;ch=getchar();} 23 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 24 return x*f; 25 } 26 27 bool cmp(Edge A,Edge B) 28 { 29 return A.w<B.w; 30 } 31 32 int find(int a) 33 { 34 while(F[a]!=0) a=F[a]; 35 return a; 36 } 37 38 int main() 39 { 40 s=read();p=read(); 41 for(int i=1;i<=p;i++) 42 { 43 x[i]=read();y[i]=read(); 44 } 45 for(int i=1;i<=p;i++) 46 for(int j=i+1;j<=p;j++) 47 { 48 E[node++]=(Edge){i,j,sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))}; 49 } 50 sort(E,E+node,cmp); 51 int num=p; 52 for(int i=0;i<node&&num>0;i++) 53 { 54 int u=find(E[i].u); 55 int v=find(E[i].v); 56 if(u!=v) 57 { 58 F[u]=v; 59 num--; 60 ans.push_back(E[i].w); 61 } 62 } 63 sort(ans.begin(),ans.end()); 64 printf("%.2lf",ans[p-s-1]); 65 return 0; 66 }
时间: 2024-10-15 02:27:14