asf
2015-08-26 17:50
316 查看
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int m; int k; int P; int pre[550]; double d[550]; struct post { double x; double y; }p[550]; struct node//构建临界矩阵,W代表距离权值 { int u; int v; double w; }e[250001]; int cmp(node x, node y) { return x.w < y.w ; } double get_dis(double x1,double y1,double x2,double y2)//两个炮台之间的距离,对应坐标乘积的平方根 { return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); } void init ()//初始化所有炮台,看作各自独立 { for(int i = 1;i<=P;i++) { pre[i] = i; } } int find(int x)//并查集根结点 { int r = x; while(r != pre[r]) { r = pre[r] ; } int i = r; int j; while(pre[i] != i) { j = pre[i]; pre[i] = r; i = j; } return r; } bool join(int x, int y)//并查集结点合并判断 { int f1 = find(x); int f2 = find(y); if(f1 != f2) { pre[f1] = f2; return true; } return false; } void kruskal(int n) { k = 0; double Max = 0; for(int i=0;i<m;i++) { if(join(e[i].u, e[i].v)) { d[k++] = e[i].w; n--; if(n == 1) { return ; } } } } int main() { int t,S; double x,y; scanf("%d",&t); while(t--) { m = 0; scanf("%d%d",&S,&P); init(); for(int i=1;i<=P;i++) { scanf("%lf%lf",&p[i].x, &p[i].y ); } for(int i=1;i<P;i++) { for(int j=i+1;j<=P;j++) { e[m].u = i; e[m].v = j; e[m].w = get_dis(p[i].x, p[i].y, p[j].x, p[j].y );//计算出坐标间距离并存入结构体数组 e[m].u = j; e[m].v = i; e[m++].w = get_dis(p[i].x, p[i].y ,p[j].x ,p[j].y ); //无向图,将i,j交换实现互通 } } sort(e,e+m,cmp);//C++内置快速排序,按照权值降序排列 kruskal(P); printf("%.2f\n",d[P-S-1]); } return 0; }
相关文章推荐
- pl/sql链接远程oracle
- Android平台Overlay机制
- jQuery中大于gt和小于lt
- jquery的页面加载完执行的函数
- java综合(四)spring与hibernate整合
- DNS下的administrative tools 之rndc
- Log4j按级别输出日志到不同文件配置分析
- 十个有用的CSS选择器
- 一次处理ORA-06512的经验
- ftp4j
- 使用addView方法时,如何保持已有动态控件位置不被改变
- SSH客户端执行SQL命令时不能一次全部执行
- hdu1203
- foreach 和for语句比较
- mac sublime3+xdebug+firefox调试环境的搭建
- 实现自定义的安卓拍照功能
- kafka学习(一)
- leetcode: Binary Tree Postorder Traversal
- iOS 指纹解锁
- C#观察者模式:面试经常遇到(猫叫、老鼠逃、人醒)