Kruskal——无线通讯网

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

·题面:

国防部计划用无线网络连接若干个边防哨所。2 种不同的通讯技术用来搭建无线网络;

每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。

任意两个配备了一条卫星电话线路的哨所(两边都ᤕ有卫星电话)均可以通话,无论他们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过 D,这是受收发器的功率限制。收发器的功率越高,通话距离 D 会更远,但同时价格也会更贵。

收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个 D。你的任务是确定收发器必须的最小通话距离 D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。

输入格式

从 wireless.in 中输入数据第 1 行,2 个整数 S 和 P,S 表示可安装的卫星电话的哨所数,P 表示边防哨所的数量。接下里 P 行,每行两个整数 x,y 描述一个哨所的平面坐标(x, y),以 km 为单位。

输出格式

输出 wireless.out 中

第 1 行,1 个实数 D,表示无线电收发器的最小传输距离,精确到小数点后两位。

·方法: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;
} 

  

posted @ 2019-10-09 11:36  Au0702  阅读(123)  评论(0编辑  收藏  举报