poj 2349 Arctic Network 並查集 連通分支數,二分答案

題目地址:poj2349

題目思路:S實際上就是最後最佳答案對應的連通分支數(額,一開始沒有理解爲什麼不是S+1,最後發現...每一個連通分支都要對應一個啊)

然後二分答案,如果當前的D使得連通分支<S, 那麼D太大了,= 的情況應該併入這一類。

額,INF設置的太大會TLE 剛好是最遠距離就行。

代碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>

const double eps=1e-8;

using namespace std;




struct edge
{
    int u;
    int v;
    double  w;
   
};




edge e[250000];
int  fa[505];

int  find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
bool  edge_cmp(edge a,edge b)
{
    return a.w<b.w;
}

int n,m;

int cc;



int calc_cc()
{
    for(int i=0;i<m;i++)
    {
        if(cc==1)  break;
        int x=find(e[i].u);
        int y=find(e[i].v);
        
        if(x!=y)
        {
            fa[x]=y;
            
            cc--;
           
        }
    }
    
    return cc;
}



void   init()
{
    for(int i=0;i<n;i++)
    {
        fa[i]=i;
    }
    cc=n;

}

struct Point
{
    double x;
    double y;
    Point(double x=0,double y=0):x(x),y(y) {}
    
};

typedef  Point  Vector;

Vector  operator-(Point A,Point B)
{
    return  Point(A.x-B.x,A.y-B.y);
}

double Length(Vector A)
{
    return sqrt(A.x*A.x+A.y*A.y);
}

Point read_point()
{
    Point A;
    scanf("%lf%lf",&A.x,&A.y);
    return A;
}

int S,P;

Point p[505];


int main()
{
    int T;
    cin>>T;
    while(cin>>S>>n)
   {
       for(int i=0;i<n;i++)
       {
           p[i]=read_point();
       }
       
       double l=0,r=30000;
      
       
       double mid;
        while(r-l>1e-4)
       {
           mid=l+(r-l)/2;
           init();
          
           int cnt=0;
           for(int i=0;i<n;i++)
               for(int j=i+1;j<n;j++)
               {
                   if(Length(p[i]-p[j])<=mid)
                   {
                       e[cnt].u=i;
                       e[cnt].v=j;
                       cnt++;
                   }
               }
           m=cnt;
           
           int c_c=calc_cc();
           if(c_c<=S)
           {
               r=mid;
           }
           else
           {
              l=mid;
           }
          
       }
       
       printf("%.2f\n",mid);
   }
    
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章