Arctic Network POJ

来源:互联网 发布:达梦数据库下载网盘 编辑:程序博客网 时间:2024/06/01 15:23
/**题意:现有m个地点,n 个卫星。卫星有一个神奇的作用, 作用在于只要某个地方安装有卫星, 不论他们之间距离为多远, 都能够互相接收到彼此间信 号, (这么好的东西当然不会让每个地方都有的), 那么其他地方需要通过收发器 D 来连接。让你求1 - m 个地方在共安装过n.个卫星后.我们所需要的收发器D所需的最大距离是多少?说白了就是我们在最远的地方进行安装卫星,尽量寻找最短的接收器的距离;最小生成树prim*/#include<cstdio>#include<cmath>#include<iostream>#include<algorithm>using namespace std;const int maxn=1e3+7;const double inf=0x3f3f3f3f*1.0;int m,n;double mmp[maxn][maxn],dis[maxn];bool vis[maxn];struct node{    double x,y;}edge[maxn];double far(node a,node b){    double x=a.x-b.x;    double y=a.y-b.y;    return sqrt(x*x+y*y);}void build_map(){    for(int i=1;i<m;i++)        for(int j=i+1;j<=m;j++)            mmp[i][j]=mmp[j][i]=far(edge[i],edge[j]);}void prim(){    for(int i=1;i<=m;i++)    {        vis[i]=false;        dis[i]=mmp[1][i];    }    vis[1]=true;    dis[1]=0;    for(int i=1;i<=m;i++)    {        int k=-1;        double Min=inf;        for(int j=1;j<=m;j++)        {            if(!vis[j]&&dis[j]<Min)            {                Min=dis[j];                k=j;            }        }        if(k==-1) break;        vis[k]=true;        for(int j=1;j<=m;j++)            if(!vis[j]&&mmp[k][j]<dis[j])                dis[j]=mmp[k][j];    }    sort(dis+1,dis+m+1);//开始还WA了一回 后来才发现是排序出了一点问题;    printf("%.2f\n",dis[m-n+1]);}int main (){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d %d",&n,&m);        for(int i=1;i<=m;i++)            for(int j=1;j<=m;j++)            if(i==j) mmp[i][j]=0;        else mmp[i][j]=inf;        for(int i=1;i<=m;i++)            scanf("%lf %lf",&edge[i].x,&edge[i].y);            build_map();            prim();    }    return 0;}