·洛谷入口:https://www.luogu.org/problem/P1991

·题面:

·方法:Kruskal

·易错点:

fa[]的初始化,数量应是点数,非边数,否则多存数组会内存爆炸导致gg!!!

·代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int s,p;
int tot=0;
double dis=0;
int fa[5001];
int xx[50001],yy[50001];
struct node
{
	int from,to;
	double v;
}e[500001];
int cmp(node a,node b)
{
	return a.v<b.v;
}
int getfather(int x)
{
	return x==fa[x]?x:fa[x]=getfather(fa[x]);
}
void kruskal()
{
	int fax,fay,cnt=0;
	double res=0;
	for(int i=1;i<=tot;i++)
	{
		fax=getfather(e[i].from);
		fay=getfather(e[i].to);
		if(fax!=fay)
		{
			fa[fax]=fay;
			cnt++;
			res=max(res,e[i].v);
			}
		if(cnt==p-s)
		{
			printf("%.2lf",res);
			return ;
			}
		}
}
int main()
{
	cin>>s>>p;

	for(int i=1;i<=p;i++)
	{
		cin>>xx[i]>>yy[i];
		for(int j=1;j<i;j++)
		{
			double d;
			d=sqrt((xx[i]-xx[j])*(xx[i]-xx[j])+(yy[i]-yy[j])*(yy[i]-yy[j]));
			tot++;
			e[tot].from=i;e[tot].to=j;e[tot].v=d;
				}
			}

	for(int i=1;i<=p;i++) fa[i]=i;
//p为点数,tot为边数,fa记录的为点数
	sort(e+1,e+tot+1,cmp);
	kruskal();

	return 0;
}

  

01-18 08:17