10369 - Arctic Network
这题的意思是给出p个点,然后p的点可以由无线电通信或者是卫星通信,然后只有m的点能通过卫星通信,然后用无线电通信的点的距离不能超过D超过D的话惠氏通信的成本增加,问在使通信成本就低的情况下求D
这题还是最小生成树,用prim算法构造MST,在构造的过程将每次算的最小的权值存到数组f里面,然后按照升序排序。因为卫星通信可以无限远,就是说后m的权值可以不用算,所以答案就是f[p-m].
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; const double inf=2500000; double G[555][555]; int x[555],y[555]; double low[555]; int vis[555]; double f[555]; int m,p; double get_dis(int a,int b,int c,int d) { return sqrt(pow(a-c,2.0)+pow(b-d,2.0)); } void prim() { memset(vis,0,sizeof(vis)); int pos=1; double min; vis[1]=1; for(int i=1;i<=p;i++) low[i]=G[pos][i]; for(int i=1;i<p;i++) { min=inf; for(int j=1;j<=p;j++) { if(!vis[j]&&low[j]<min) { min=low[j]; pos=j; } } vis[pos]=1; f[i]=min; for(int j=1;j<=p;j++) { if(!vis[j]&&low[j]>G[pos][j]) low[j]=G[pos][j]; } } sort(f+1,f+p); printf("%0.2lf\n",f[p-m]); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d",&m,&p); for(int i=1;i<=p;i++) scanf("%d %d",&x[i],&y[i]); int k=0; for(int i=1;i<=p;i++) { for(int j=i+1;j<=p;j++) G[i][j]=G[j][i]=get_dis(x[i],y[i],x[j],y[j]); } prim(); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· 盘点!HelloGitHub 年度热门开源项目
· 某Websocket反爬逆向分析+请求加解密+还原html
· DeepSeek V3 两周使用总结
· 02现代计算机视觉入门之:什么是视频
· 回顾我的软件开发经历:我与代码生成器的涅槃之路