您的位置:首页 > 其它

POJ2349 Arctic Network

2015-09-26 11:22 337 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: