这题还是最小生成树,用prim算法构造MST,在构造的过程将每次算的最小的权值存到数组f里面,然后按照升序排序。因为卫星通信可以无限远,就是说后m的权值可以不用算,所以答案就是f[p-m].
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; const double inf=2500000; double G[555][555]; int x[555],y[555]; double low[555]; int vis[555]; double f[555]; int m,p; double get_dis(int a,int b,int c,int d) { return sqrt(pow(a-c,2.0)+pow(b-d,2.0)); } void prim() { memset(vis,0,sizeof(vis)); int pos=1; double min; vis[1]=1; for(int i=1;i<=p;i++) low[i]=G[pos][i]; for(int i=1;i<p;i++) { min=inf; for(int j=1;j<=p;j++) { if(!vis[j]&&low[j]<min) { min=low[j]; pos=j; } } vis[pos]=1; f[i]=min; for(int j=1;j<=p;j++) { if(!vis[j]&&low[j]>G[pos][j]) low[j]=G[pos][j]; } } sort(f+1,f+p); printf("%0.2lf ",f[p-m]); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d",&m,&p); for(int i=1;i<=p;i++) scanf("%d %d",&x[i],&y[i]); int k=0; for(int i=1;i<=p;i++) { for(int j=i+1;j<=p;j++) G[i][j]=G[j][i]=get_dis(x[i],y[i],x[j],y[j]); } prim(); } return 0; }