POJ 2349

来源:互联网 发布:centos 查看软件版本 编辑:程序博客网 时间:2024/04/30 09:49

题意:给出n个卫星, m个哨站,n个卫星可以分配给哨站,每一个拥有卫星的哨站可以通过卫星频道和其他哨站向连接,否者就需要通过雷达相连接,但是雷达能大覆盖的距离是D,让你求这个最小的D、

思路:Kruskal求最小生成树,距离生成树中越大的距离是肯定要分配卫星的,那么n个卫星分配给n个距离生成树最大的哨站

#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int qq=510;double x[qq],y[qq];int pre[qq];int n,m,tot;struct Edge{int u,v;double w;Edge(){}Edge(int a, int b, double c):u(a),v(b),w(c){}bool operator < (const Edge &a)const{return w<a.w;}}edge[qq*qq];double f(int a, int b){double ans=pow(x[a]-x[b],2.0)+pow(y[a]-y[b],2.0);return sqrt(ans);}int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);}int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);tot=0;for(int i=0; i<=m; ++i)pre[i]=i;for(int i=1; i<=m; ++i){scanf("%lf%lf",&x[i],&y[i]);for(int j=1; j<i; ++j){double ans=f(i,j);edge[tot++]=Edge(i,j,ans);}}sort(edge,edge+tot);int cnt=0;double minx;for(int i=0; i<tot; ++i){int x=find(edge[i].u);int y=find(edge[i].v);if(x==y)continue;pre[y]=x;cnt++;if(cnt==m-n)minx=edge[i].w; }printf("%.2f\n",minx);}return 0;}


0 0