POJ2349 Arctic Network

来源:互联网 发布:mac上android真机调试 编辑:程序博客网 时间:2024/06/05 17:55

题目:http://poj.org/problem?id=2349
分析:二分+并查集
代码:

#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>using namespace std;const int Tmax=505;const double Q=0.0001;struct edge{    int u,v;    double w;    bool operator <(const edge &rhs)const    {        return w<rhs.w;    }};edge G[Tmax*Tmax];int n,s,m,data[Tmax][2],f[Tmax];double dmax;bool num[Tmax];int find(int x){    return f[x]=f[x]==x?x:find(f[x]);}bool check(double x){    int i,fx,fy,sum=0;    for(i=1;i<=n;i++)      f[i]=i;    for(i=1;i<=m;i++)    {        if(G[i].w-x>Q) break;        fx=find(G[i].u);        fy=find(G[i].v);        if(fx==fy) continue;        f[fx]=fy;    }    memset(num,0,sizeof(num));    for(i=1;i<=n;i++)    {        if(num[find(i)]==true) continue;        sum++;        num[find(i)]=true;    }    if(sum<=s) return true;    return false;}void work(){    double l=0,r=dmax,mid;    while(r-l>=Q)    {        mid=(l+r)/2;        if(check(mid)==true) r=mid;        else l=mid+Q;    }             printf("%.2lf\n",r);    return;}int main(){    int T,i,j;    double d;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&s,&n);        m=0;        for(i=1;i<=n;i++)          scanf("%d%d",&data[i][0],&data[i][1]);        for(i=1;i<=n;i++)          for(j=i+1;j<=n;j++)          {            d=sqrt(1.0*(data[i][0]-data[j][0])*(data[i][0]-data[j][0])+1.0*(data[i][1]-data[j][1])*(data[i][1]-data[j][1]));            G[++m].u=i;            G[m].v=j;            G[m].w=d;            dmax=max(dmax,d);          }        sort(G+1,G+1+m);        work();    }    return 0;}
0 0
原创粉丝点击