POJ2349 Arctic Network
2015-09-26 11:22
337 查看
题目:http://poj.org/problem?id=2349
分析:二分+并查集
代码:
分析:二分+并查集
代码:
#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std; const int Tmax=505; const double Q=0.0001; struct edge{ int u,v; double w; bool operator <(const edge &rhs)const { return w<rhs.w; } }; edge G[Tmax*Tmax]; int n,s,m,data[Tmax][2],f[Tmax]; double dmax; bool num[Tmax]; int find(int x) { return f[x]=f[x]==x?x:find(f[x]); } bool check(double x) { int i,fx,fy,sum=0; for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=m;i++) { if(G[i].w-x>Q) break; fx=find(G[i].u); fy=find(G[i].v); if(fx==fy) continue; f[fx]=fy; } memset(num,0,sizeof(num)); for(i=1;i<=n;i++) { if(num[find(i)]==true) continue; sum++; num[find(i)]=true; } if(sum<=s) return true; return false; } void work() { double l=0,r=dmax,mid; while(r-l>=Q) { mid=(l+r)/2; if(check(mid)==true) r=mid; else l=mid+Q; } printf("%.2lf\n",r); return; } int main() { int T,i,j; double d; scanf("%d",&T); while(T--) { scanf("%d%d",&s,&n); m=0; for(i=1;i<=n;i++) scanf("%d%d",&data[i][0],&data[i][1]); for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { d=sqrt(1.0*(data[i][0]-data[j][0])*(data[i][0]-data[j][0])+1.0*(data[i][1]-data[j][1])*(data[i][1]-data[j][1])); G[++m].u=i; G[m].v=j; G[m].w=d; dmax=max(dmax,d); } sort(G+1,G+1+m); work(); } return 0; }
相关文章推荐
- signal(SIGCLD,SIG_IGN) http://blog.csdn.net/cffishappy/article/details/7005115
- LeetCode---Search Insert Position
- Android实战简易教程<四十六>(自定义控件体验之罗盘)
- Android实战简易教程<四十七>(ListView多选-实现点餐系统)
- HDFS 2.7.1 所有shell命令
- 使用autolayout自定义动态高度的cell
- Android实战简易教程<四十八>(App引导页面效果实现)
- Android实战简易教程<四十九>(两种方式实现网络图片异步加载)
- FlyMcu串口ISP下载STM32程序教程
- 黑马程序员————java实现:筛选法求素数
- linux设备号详解
- java 声明和动态创建数组
- 转载 ---------------- vi 編輯器簡介
- Android实战简易教程<五十>(工具类的测试)
- Android实战简易教程<五十一>(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)
- java从命令行接收多个数字,求和之后输出结果
- Sprite3D学习笔记(一):3D模型的换装功能.
- 暑假集训第三周STL 大小写的全排列
- MySQL . column_key
- python2.7 中使用pip遇到的几个问题