【POJ】[2349]Arctic Network
2016-02-21 00:47
274 查看
理解题意之后也并不算太难
大意是给了一些坐标来求最小生成树
然而让输出的是最大边的值,而因为还有卫星可供通讯
所以只需要当有P个点S个卫星时
共P-1条边里舍去S-1条大的边
所以这里我感觉用Kruskal更好一些
而且当取了
P-1-(S-1)==P-S条边时,这一条边便是所要求边
不需要进行后续操作了
[code]#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; struct edge { int u,v; double dis; } e[250200]; int par[520]; int ran[520]; int find(int m) { if(m==par[m]) return m; else return par[m]=find(par[m]); } void unite(int x,int y) { x=find(x); y=find(y); if(x==y) return; if(ran[x]<ran[y]) par[x]=y; else { par[y]=x; if(ran[x]==ran[y]) ran[x]++; } } bool cmp(edge A,edge B) { return A.dis<B.dis; } struct xy { double x,y; } x[520]; int main() { int T; scanf("%d",&T); while(T--) { int S,N; scanf("%d %d",&S,&N); for(int i=1; i<=N; i++) { par[i]=i; ran[i]=0; } for(int i=1; i<=N; i++) { scanf("%lf %lf",&x[i].x,&x[i].y); } int cnt=-1; for(int i=1; i<=N; i++) { for(int j=1; j<=N; j++) { if(i==j) continue; e[++cnt].u=i; e[cnt].v=j; e[cnt].dis=sqrt(pow(x[i].x-x[j].x,2)+pow(x[i].y-x[j].y,2)); } } sort(e,e+cnt+1,cmp); double sum=0; int res=0; for(int i=0; i<=cnt; i++) { if(find(e[i].u)!=find(e[i].v)) { res++; if(res==N-S) { printf("%.2lf\n",e[i].dis); break; } unite(e[i].u,e[i].v); } } } return 0; }
题目地址:【POJ】[2349]Arctic Network
相关文章推荐
- java 基础异常使用总结
- sql常用命令
- 静态static修饰符
- Unity插件-NGUI学习笔记
- 10分钟搞懂树状数组
- [maya学习笔记(8)] 物体的复制与对齐
- objective c, category 和 protocol 中添加property
- 矩阵分解方法
- asp.net mvc 5 微信接入VB版 - 获取AccessToken
- 《敏捷软件开发》《企业应用架构模式》读后感
- 基于矩阵分解的隐因子模型
- 《Android源码设计模式》读书笔记 (9) 第9章 责任链模式
- 线程池线程数与(CPU密集型任务和I/O密集型任务)的关系
- 构建自己的PHP框架--定义ORM的接口
- Android 实现可以暂停旋转的ObjectAnmition动画
- 20160208.CCPP体系详解(0018天)
- 20160208.CCPP体系详解(0018天)
- ami bios设置图解
- 20160208.CCPP体系详解(0018天)
- poj 3628 Bookshelf 2