首页 > 代码库 > NOIP模拟赛 无线通讯网
NOIP模拟赛 无线通讯网
【题目描述】
国防部计划用无线网络连接若干个边防哨所。2种不同的通讯技术用来搭建无线网络;每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。
任意两个配备了一条卫星电话线路的哨所(两边都拥有卫星电话)均可以通话,无论他们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过D,这是受收发器的功率限制。收发器的功率越高,通话距离D会更远,但同时价格也会更贵。
收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个D。
你的任务是确定收发器必须的最小通话距离D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。
【输入格式】 wireless.in
第1行:2个整数S(1<=S<=100)和P(S<P<=500),S表示可安装的卫星电话的哨所数,P表示边防哨所的数量。
接下里P行,每行描述一个哨所的平面坐标(x,y),以km为单位,整数,0<=x,y<=10000。
【输出格式】 wireless.out
第1行:1个实数D,表示无线电收发器的最小传输距离。精确到小数点后两位。
【样例输入】
2 4
0 100
0 300
0 600
150 750
【样例输出】
212.13
数据范围
对于20%的数据 P=2,S=1
对于另外20%的数据 P=4,S=2
对于100%的数据 1<=S<=100,S<P<=500
kruskal最小生成树
题解:
用vector容器储存最大值
有几个卫星电话,就取倒数第几个最大值
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 8 struct Edge 9 {10 int u,v;11 double w;12 }E[300000];13 int F[501];14 15 vector<double> ans;16 17 int s,p,node=0,x[501],y[501];18 19 int read()20 {21 int x=0,f=1;char ch=getchar();22 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-f;ch=getchar();}23 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}24 return x*f;25 }26 27 bool cmp(Edge A,Edge B)28 {29 return A.w<B.w;30 }31 32 int find(int a)33 {34 while(F[a]!=0) a=F[a];35 return a;36 }37 38 int main()39 {40 s=read();p=read();41 for(int i=1;i<=p;i++)42 {43 x[i]=read();y[i]=read();44 }45 for(int i=1;i<=p;i++)46 for(int j=i+1;j<=p;j++)47 {48 E[node++]=(Edge){i,j,sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))};49 }50 sort(E,E+node,cmp);51 int num=p;52 for(int i=0;i<node&&num>0;i++)53 {54 int u=find(E[i].u);55 int v=find(E[i].v);56 if(u!=v)57 {58 F[u]=v;59 num--;60 ans.push_back(E[i].w);61 }62 }63 sort(ans.begin(),ans.end());64 printf("%.2lf",ans[p-s-1]);65 return 0;66 }
NOIP模拟赛 无线通讯网
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。