Arctic Network UVA

来源:互联网 发布:石岐unity3d招聘 编辑:程序博客网 时间:2024/05/18 05:15

Arctic Network UVA - 10369

二分

题目大意:

有n个前哨站,现在有两种通信技术去连接哨站,卫星技术和无线电技术,通过卫星技术需要一个卫星信道,现在已知有m个信道,问说连接所有哨站时,通过无线电技术连接的最长距离的最小值。(每个哨站已经设立好了接受装置,卫星通信无需考虑距离)

题解:

二分一个答案x,只能走小于等于x的边。给每个连通块配备一台卫星电话,dfs一下有几个连通块,看看是不是小于m即可。

Code:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int N = 1005;int n,m;struct Point{    double x,y;    Point(){}    Point(double _x,double _y){ x=_x; y=_y; }   }p[N];double dis(Point &a,Point &b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}bool vis[N];void dfs(int u,double x){    vis[u]=true;    for(int v=1;v<=n;v++){        if(dis(p[u],p[v])<=x && !vis[v]){            dfs(v,x);        }    }}bool check(double x){    int cnt=0;    memset(vis,false,sizeof(vis));    for(int i=1;i<=n;i++){        if(!vis[i]){            dfs(i,x); cnt++;        }    }    return cnt<=m;}int main(){    freopen("a.in","r",stdin);    int T; cin>>T;    while(T--){        scanf("%d%d",&m,&n);        for(int i=1;i<=n;i++){            scanf("%lf%lf",&p[i].x,&p[i].y);        }        double l=0.0, r=20000, mid;        for(int i=1;i<=100;i++){            mid=(l+r)/2;            if(check(mid)) r=mid;            else l=mid;        }        printf("%.2f\n",mid);    }   }
原创粉丝点击