80pts 求调 (WA on #3 and #5)
查看原帖
80pts 求调 (WA on #3 and #5)
1043658
Purple_meteor楼主2025/6/14 12:26
#include<bits/stdc++.h>
using namespace std;
int n,k;
struct point
{
	int x,y;
	int belong = 0;	//所属部落
}P[1001];

double road[1001][1001];

bool check(double len) //判断以len为最近部落距离的方案是否可行
{
	for(int i=1;i<=1000;i++)
	P[i].belong = 0;
	
	int tot = 0;
	queue<int> q;
	
	for(int i=1;i<=n;i++)
	{
		if(!P[i].belong) P[i].belong = ++tot,q.push(i);
		while(!q.empty())
		{
			int x = q.front();
			q.pop();
			for(int j = 1;j <= n;j ++)
			if(road[x][j]<len&&!P[j].belong) P[j].belong = P[x].belong,q.push(j);
		}
	}
	
	return tot >= k;
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	cin>>P[i].x>>P[i].y;
	
	//预处理长度
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	road[i][j]=sqrt(pow(P[i].x - P[j].x,2) + pow(P[i].y - P[j].y,2));
	//
	
	//二分查找
	double l = 1, r = 20000, mid = ( l + r ) / 2;
	while(r - l > 0.001) 
	{
		if( check( mid ) ) l = mid;
		else r = mid;
		mid = ( l + r ) / 2;
	}
	//
	cout<<fixed<<setprecision(2)<<mid<<endl;
	return 0;
}
2025/6/14 12:26
加载中...