40pts求调
查看原帖
40pts求调
411716
ShallowMaple楼主2024/1/27 20:47
#include<iostream>
#include<cstdio>
#include<cmath>

using namespace std;

const int N = 1e4 + 5;
int fa[N];
int s, p;

struct Node{
	double x, y;
} a[N];

int getfa(int x)
{
	if(fa[x] != x) fa[x] = getfa(fa[x]);
	return fa[x];
}

void merg(int a, int b)
{
	fa[getfa(a)] = getfa(b);
}

bool check(double x)
{
	for(int i = 1; i <= p; i ++) fa[i] = i;
	int cnt = p;	
	
	for(int i = 2; i <= p; i ++)
	{
		double min_dis = 0x3f3f3f3f;
		int min_lct = 0;	
		for(int j = 1; j < i; j ++)
		{
			double tmp = sqrtl((a[i].x - a[j].x) * (a[i].x - a[j].x) + (a[i].y - a[j].y) * (a[i].y - a[j].y));
			if(min_dis > tmp) min_dis = tmp, min_lct = j;
		}		
		
		//cout << "i = " << i << " " << min_lct << endl;
		
		if(min_dis <= x)
		{
			if(getfa(i) != getfa(min_lct)) 
			{
				merg(i, min_lct);	
				cnt --;
			}
		}
		
		//cout << "dis: " << min_dis << " x: " << x << " " << " cnt : " << cnt << endl;
		if(cnt <= s) return true;	
	}	
	return false;	
}

int main()
{
	ios::sync_with_stdio(false), cin.tie(0);
	
	cin >> s >> p;
	for(int i=1; i<=p; i++) cin >> a[i].x >> a[i].y;
	
	double l = 0, r = 15000;
	while(r - l > 1e-6)
	{
		double mid = (l + r) / 2;
		if(check(mid)) r = mid;
		else l = mid;
	}
	printf("%.2lf", l);
	
	return 0;
}
2024/1/27 20:47
加载中...