感觉都是这种问题,40pts求助
查看原帖
感觉都是这种问题,40pts求助
767353
Oct0pus1楼主2022/10/16 14:26
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
struct edge{
	int u,v;
	double w;
	inline bool operator<(const edge &o)const{return w<o.w;}
};
vector<edge> e,e1;
int s,p,fa[510];
double x[510],y[510];
bool vis[510];
inline double dis(int i,int j){
	return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
inline int find(int x){
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
inline void merge(int a,int b){
	a=find(a),b=find(b);
	if(a!=b)fa[b]=a;
}
int main(){
	scanf("%d%d",&s,&p);
	for(int i=1;i<=p;i++)fa[i]=i;
	for(int i=1;i<=p;i++)scanf("%lf%lf",&x[i],&y[i]);
	for(int i=1;i<=p;i++)
		for(int j=i+1;j<=p;j++)
			e.push_back((edge){i,j,dis(i,j)});
	sort(e.begin(),e.end());
	for(int i=0;i<e.size();i++){
		if(find(e[i].u)!=find(e[i].v)){
			merge(e[i].u,e[i].v);
			e1.push_back(e[i]);
		}
		if(e1.size()==p-1)break;
	}
	for(int i=e1.size()-1;i>=0;i--){
		if(!vis[e1[i].u]){
			vis[e1[i].u]=true;
			s--;
			if(!s){
				printf("%.2lf",e[i].w);
				return 0;
			}
		}
		if(!vis[e1[i].v]){
			vis[e1[i].v]=true;
			s--;
			if(!s){
				printf("%.2lf",e[i-1].w);
				return 0;
			}
		}
	}
//	for(int i=0;i<e1.size();i++)printf("%d %d %lf\n",e[i].u,e[i].v,e[i].w);
	return 0;
}
2022/10/16 14:26
加载中...