问题描述:国防部要通过无线网络同几个北方的哨所进行通信。两种不同的通信技术将被用于建立网络:每个哨所拥有一台无线电收发报机以及其中一些哨所还拥有一个卫星频道。
任何两个拥有卫星频道的哨所,无论它们的位置在哪里,都可以通过卫星进行通信。否则,这两个哨所由于收发报机的功率,只有在它们之间的距离不超过D的情况下,通过无线电进行联络。D的值越高,就要用功率更高的收发报机,但这样成本非常高。出于采购和维修方面的考虑,哨所使用的收发报机必须是相同的;也就是说,对每一对哨所,D的值必须是相同的。
请你确定收发报机的最小D值。在每对哨所之间,必须至少有一条(直接或间接的)通信路径。
输入:
输入的第一行给出N,表示测试用例的个数。每个测试用例的第一行给出S和P,其中S表示卫星频道的数量,1≤S≤100;P表示哨所的数量,S<P≤500。接下来给出P行,每行给出一个哨所的(x,y)坐标,以公里为单位(坐标是在0和10000之间的整数)。
输出:
对每个测试用例,输出一行,给出要连接网络的最小的D值,精确到小数点后2位。
Sample input |
Sample output |
1 2 4 0 100 0 300 0 600 150 750 |
212.13 |
#include <iostream> #include <cmath> #define MAX 1000 using namespace std; struct Point { int x; int y; }point[10]; int main() { int n; cin>>n; int s,p; cin>>s>>p; for(int i=1;i<=n;i++) { //Point point[p]; for(int j=0;j<p;j++) { cin>>point[j].x>>point[j].y; } double map[p][p]; for(int i1=0;i1<p;i1++) { for(int i2=0;i2<p;i2++) { if(i1==i2) { map[i1][i2]=MAX; } else { map[i1][i2]=sqrt((point[i1].x-point[i2].x)*(point[i1].x-point[i2].x)+(point[i1].y-point[i2].y)*(point[i1].y-point[i2].y)); } } } /* for(int l1=0;l1<p;l1++) { for(int l2=0;l2<p;l2++) { cout<<map[l1][l2]<<" "; } cout<<endl; }*/ bool judge[p];//存储是否访问 for(int j2=0;j2<p;j2++) { judge[j2]=false; } double num[p-1];//存储长度 int z=0; int h=0; while(1) { judge[z]=true; double min=MAX; int k=0; int j3; for(j3=0;j3<p;j3++) { if(map[z][j3]<min) { if(judge[j3]==false) { k=j3; min=map[z][j3]; } } } judge[k]=true; num[h++]=map[z][k]; int i; for(i=0;i<p;i++) { if(judge[i]==false) { break; } } if(i==p) { break; } z=k; } /* for(int j4=0;j4<p-1;j4++) { cout<<num[j4]<<" "; } cout<<endl;*/ for(int j5=0;j5<p-2;j5++) { for(int j6=j5+1;j6<p-1;j6++) { if(num[j5]<num[j6]) { double temp=num[j5]; num[j5]=num[j6]; num[j6]=temp; } } } printf("%.2f",num[1]); } }