P4047 [JSOI2010]部落划分
作者:互联网
一眼二分:
二分出最近的两个部落之间的最大距离,判断当前mid距离下能否划分成k个连通块
const int N=1010;
PII a[N];
int p[N];
double dist[N][N];
int n,k;
double dis(PII a,PII b)
{
return sqrt((a.fi-b.fi)*(a.fi-b.fi)+(a.se-b.se)*(a.se-b.se));
}
int find(int x)
{
if(x != p[x]) p[x]=find(p[x]);
return p[x];
}
bool check(double mid)
{
for(int i=0;i<n;i++) p[i]=i;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
if(dist[i][j] > mid) continue;
int pi=find(i),pj=find(j);
p[pi]=pj;
}
int cnt=0;
for(int i=0;i<n;i++)
if(p[i] == i)
cnt++;
return cnt>=k;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i].fi>>a[i].se;
double l=INF,r=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
dist[i][j]=dis(a[i],a[j]);
l=min(l,dist[i][j]);
r=max(r,dist[i][j]);
}
for(int i=0;i<100;i++)
{
double mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.2f\n",l);
//system("pause");
}
标签:JSOI2010,PII,部落,int,double,P4047,fi,find,se 来源: https://www.cnblogs.com/fxh0707/p/13631705.html