2019 GDUT 新生专题Ⅲ E题

E - Arctic Network

国防部(DND)希望通过无线网络连接几个北方前哨。在建立网络时,将使用两种不同的通信技术:每个前哨站将有一个无线电收发机,一些前哨站还将有一个卫星频道。

任何两个有卫星信道的前哨站都可以通过卫星进行通信,而不管它们的位置如何。否则,只有当两个前哨站之间的距离不超过D时,它们才能通过无线电进行通信,这取决于收发器的功率。更高的功率产生更高的D,但成本更高。出于购买和维护的考虑,前哨站的收发器必须是相同的;也就是说,每对前哨站的D值都是相同的。

您的工作是确定收发器所需的最小D。每对前哨站之间必须至少有一条通信路径(直接或间接)。

输入

输入的第一行包含N,测试用例的数量。每个测试用例的第一行包含1<=S<=100(卫星信道数)和S<P<=500(前哨站数)。随后是P线,给出每个前哨的(x,y)坐标(单位:km)(坐标是0到10000之间的整数)。

输出

对于每种情况,输出应包括给出连接网络所需的最小D。输出应指定为2个小数点
Sample Input
1
2 4
0 100
0 300
0 600
150 750
Sample Output
212.13
思路:首先题目要求每个点都能够联通,所以可以先建立一个最小生成树,然后根据题目里卫星信道的作用,两个信道之间可以形成一条道路,并且不受距离影响。
比如1.给出有两个卫星通道,即s=2,可以形成一条通路,可以用贪心的思想,排除最小生成树中边权最大的,剩下最大的就是结果。
比如2.s=4,p=7,先建立最小生成树X,边数为6,再根据有4个卫星信道,可以构造最小生成树T,T是X的子树,边数为3且为X中最大的三条边,故给X的六条边权排序,除去最大的三条边,剩下最大的就是结果。
代码用到了prim求最小生成树。
代码

#include <cstdio>
#include <algorithm>
#include <math.h>
using namespace std;
const int MAX_V=505;
const int inf=999999999;
double cost[MAX_V][MAX_V],mincost[MAX_V],a[MAX_V];//mincost是记录一个点到其他点的最短距离的数组,时刻更新的。 
int s,p;
bool used[MAX_V];
struct point{
	double x,y;
}e[MAX_V];//记录点的坐标。 
void prim(){
	mincost[0]=0;
	int cur=0;
	while(true){
		int v=-1;
		for(int i=0;i<p;i++){
			if(!used[i]&&(v==-1||mincost[i]<mincost[v])) v=i;
		}//寻找距离上一个点最近的且没标记过的点 。 
			if(v==-1) break;//所有点都被标记,循环结束。 
			used[v]=true;//标记 
			if(mincost[v]!=0)
			a[cur++]=mincost[v];//存储已生成的树的每条边。 
			for(int i=0;i<p;i++){
				mincost[i]=min(mincost[i],cost[v][i]);
			}
	}
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&s,&p);
		fill(cost[0],cost[0]+MAX_V*MAX_V,inf);
		fill(mincost,mincost+MAX_V,inf);
		fill(used,used+MAX_V,false);//初始化。 
		for(int i=0;i<p;i++){
			scanf("%lf%lf",&e[i].x,&e[i].y);
		}
		for(int i=0;i<p;i++){
			for(int j=0;j<p;j++){
				if(i==j) continue;
				cost[i][j]=sqrt((e[i].x-e[j].x)*(e[i].x-e[j].x)+(e[i].y-e[j].y)*(e[i].y-e[j].y));
			}
		}
		prim();
		sort(a,a+p-1);//排序最小生成树的所有边权。 
		printf("%.2f\n",a[p-1-s]);//筛去前s-1大的边权,剩下最大的边权就是结果。 
	}
	return 0;
}
发布了32 篇原创文章 · 获赞 0 · 访问量 2377
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览