求一个覆盖所有点的最小圆 最小圆覆盖

题目大意:平面上有n个点,求绘制一个半径最小的圆,覆盖所有的点  精度0.1  点的坐标最大为 100000

 

方法1:http://wenku.baidu.com/view/584b6d3e5727a5e9856a610d.html   O(n)

方法2:三分套三分暴力求解如下。O(1600 n)时间开销  1600~(log  2/3  0.1/100000) ^2

 1 float disy(float y,float x)
 2 {
 3     int n=pvec.size();
 4     float Rmin=0;
 5     
 6     for(int i=0;i<n;i++)
 7     {
 8         Rmin=max(Rmin,sqrt((pvec[i].y-y)*(pvec[i].y-y)+ (pvec[i].x-x)*(pvec[i].x-x)));
 9     }
10     return Rmin;
11 }
12 float dis(float x)
13 {
14     ymax=10000,ymin=0;
15     while(ymax-ymin>accu)
16     {
17         if(disy(ymin+(ymax-ymin)*2.0/3,x)<disy(ymin+(ymax-ymin)*1.0/3,x))
18         {
19             ymin=ymin+(ymax-ymin)*1.0/3;
20         }
21         else
22             ymax=ymin+(ymax-ymin)*2.0/3;
23     }
24     return disy((ymax+ymin)/2,x);
25 }
26 int findcenter(POINT &pstart)
27 {
28     xmax=0,xmin=10000;
29     int n=pvec.size();    
30     for(int i=0;i<n;i++)
31     {
32         xmax=max(xmax,pvec[i].x);
33         xmin=min(xmin,pvec[i].x);
34     }
35     while((xmax-xmin)/2>accu)
36     {
37         if(dis(xmin+(xmax-xmin)*1.0/3)<dis(xmin+(xmax-xmin)*2.0/3))
38         {
39             xmax=xmin+(xmax-xmin)*2.0/3;
40         }
41         else
42             xmin=xmin+(xmax-xmin)*1.0/3;
43     }
44     pstart.x=(xmax+xmin)/2;
45     pstart.y=(ymax+ymin)/2;
46     int r=disy((ymax+ymin)/2,(xmax+xmin)/2);
47     return r;
48 }

 

光顾着想用什么新方法比较好了,结果没想到最好的方法。。。

 

转载于:https://www.cnblogs.com/tjsudys/p/4464481.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值