题意:
给出各个站点的坐标,还有卫星的个数,两个卫星可以连接任意点,没有卫星的点就需要发射无线电波,求无线电波至少要有多少射程才能连接所有的点。
将求出的最少生成树的边进行排序,然后将卫星给边最长的点使用,就可以求出答案。
ps:提交的时候,G++打印double型要用%f,用%lf会打印出0。
.
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int N=505;
int n,p,cen,vis[N];
double dis[N],ma[N][N],cost[N];
struct {
int x,y;
}is[N];
double qiu(int x1,int y1,int x2,int y2){
double te=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
return sqrt(te);
}
void mem(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
double te=qiu(is[j].x,is[j].y,is[i].x,is[i].y);
ma[i][j]=te;
}
cen = 0;
}
void prim(){
for(int i=1;i<=n;i++){
dis[i]=ma[1][i];
vis[i]=0;
}
dis[1]=0;
vis[1]=1;
for(int i=1;i<n;i++){
double mi=0x3f3f3f3f;
int mb;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<mi){
mi=dis[j];
mb=j;
}
}
vis[mb]=1;
cost[cen++]=mi;
for(int i=1;i<=n;i++){
if(!vis[i]&&ma[mb][i]<dis[i]){
dis[i]=ma[mb][i];
}
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&p,&n);
int a,b;
for(int i=1;i<=n;i++){
scanf("%d%d",&a,&b);
is[i].x=a;is[i].y=b;
}
mem();
prim();
sort(cost,cost+cen);
printf("%.2f\n",cost[cen - p]);//G++中,double要用f,long long要用I64d
}
return 0;
}