1、http://acm.hdu.edu.cn/showproblem.php?pid=2440   按照题意知道是一个简单的多边形即凸包,但给出的点并没有按照顺序的,所以需要自己先求出凸包,然后在用随机淬火求费马点。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<cmath>
  6. #include<cstdlib>
  7. #include<queue>
  8. #include<stack>
  9. #include<map>
  10. #include<vector>
  11. #include<algorithm>
  12. #include<ctime>
  13. using namespace std;
  14. #define eps 1e-10
  15.  
  16. int Fabs(double d)
  17. {
  18. if(fabs(d)<eps) return ;
  19. else return d>?:-;
  20. }
  21.  
  22. struct point
  23. {
  24. double x,y;
  25. }p[],sta[];
  26. int oper[][]={,,,-,-,,,,,,,-,-,,-,-},top;
  27.  
  28. double x_multi(point p1,point p2,point p3)
  29. {
  30. return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
  31. }
  32.  
  33. double Dis(point p1,point p2)
  34. {
  35. return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
  36. }
  37.  
  38. bool cmp(point a,point b)
  39. {
  40. if(Fabs(x_multi(p[],a,b))>) return ;
  41. if(Fabs(x_multi(p[],a,b))<) return ;
  42. if(Fabs(Dis(p[],a)-Dis(p[],b))<)
  43. return ;
  44. return ;
  45. }
  46.  
  47. void Graham(int n)
  48. {
  49. int i,k=,tot;
  50. for(i=;i<n;i++)
  51. if((p[i].y<p[k].y)||((p[i].y==p[k].y)&&(p[i].x<p[k].x)))
  52. k=i;
  53. swap(p[],p[k]);
  54. sort(p+,p+n,cmp);
  55.  
  56. tot=;
  57. for(i=;i<n;i++)
  58. if(Fabs(x_multi(p[i],p[i-],p[])))
  59. p[tot++]=p[i-];
  60. p[tot++]=p[n-];
  61.  
  62. sta[]=p[],sta[]=p[];
  63. i=top=;
  64. for(i=;i<tot;i++)
  65. {
  66. while(top>=&&Fabs(x_multi(p[i],sta[top],sta[top-]))>=)
  67. {
  68. if(top==) break;
  69. top--;
  70. }
  71. sta[++top]=p[i];
  72. }
  73. }
  74.  
  75. double allDis(int n,point f)
  76. {
  77. double sum=0.0;
  78. int i;
  79. for(i=;i<n;i++)
  80. sum+=Dis(sta[i],f);
  81. return sum;
  82. }
  83.  
  84. point fermat(int n) //求费马点
  85. {
  86. double step=;
  87. int i,j;
  88. for(i=;i<n;i++)
  89. step+=fabs(sta[i].x)+fabs(sta[i].y);
  90. point f;
  91. f.x=,f.y=;
  92. for(i=;i<n;i++)
  93. f.x+=sta[i].x,f.y+=sta[i].y;
  94. f.x/=n,f.y/=n;
  95. point t;
  96. while(step>eps)
  97. {
  98. for(i=;i<;i++)
  99. {
  100. t.x=f.x+oper[i][]*step;
  101. t.y=f.y+oper[i][]*step;
  102. if(allDis(n,t)<allDis(n,f))
  103. f=t;
  104. }
  105. step/=;
  106. }
  107. return f;
  108. }
  109.  
  110. int main()
  111. {
  112. int t,n,i;
  113. scanf("%d",&t);
  114. while(t--)
  115. {
  116. scanf("%d",&n);
  117. for(i=;i<n;i++)
  118. scanf("%lf%lf",&p[i].x,&p[i].y);
  119. Graham(n);
  120. point ans=fermat(top+);
  121. printf("%.0lf\n",allDis(top+,ans));
  122. if(t>) puts("");
  123. }
  124. return ;
  125. }

2、http://acm.hdu.edu.cn/showproblem.php?pid=3694 //求一个四边形的费马点,wrong了n次网上到处查才知道此题非常严谨,卡随机淬火算法。并且给出的四边形并不一定是凸四边形,所以需要讨论,如果是凸四边形,按照四边形的特性费马点就是对角线的交点,如果是凹的就是其中某一个顶点。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<cmath>
  6. #include<cstdlib>
  7. #include<queue>
  8. #include<stack>
  9. #include<map>
  10. #include<vector>
  11. #include<algorithm>
  12. #include<ctime>
  13. using namespace std;
  14. #define eps 1e-8
  15.  
  16. int Fabs(double d)
  17. {
  18. if(fabs(d)<eps) return ;
  19. else return d>?:-;
  20. }
  21.  
  22. struct point
  23. {
  24. double x,y;
  25. }p[],sta[];
  26. int oper[][]={,,,-,-,,,,,,,-,-,,-,-},top;
  27.  
  28. double x_multi(point p1,point p2,point p3)
  29. {
  30. return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
  31. }
  32.  
  33. double Dis(point p1,point p2)
  34. {
  35. return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
  36. }
  37.  
  38. bool cmp(point a,point b)
  39. {
  40. if(Fabs(x_multi(p[],a,b))>) return ;
  41. if(Fabs(x_multi(p[],a,b))<) return ;
  42. if(Fabs(Dis(p[],a)-Dis(p[],b))<)
  43. return ;
  44. return ;
  45. }
  46.  
  47. void Graham(int n)
  48. {
  49. int i,k=,tot;
  50. for(i=;i<n;i++)
  51. if((p[i].y<p[k].y)||((p[i].y==p[k].y)&&(p[i].x<p[k].x)))
  52. k=i;
  53. swap(p[],p[k]);
  54. sort(p+,p+n,cmp);
  55.  
  56. /*tot=1;//下面直接用顶点个数判断是否为凸包,所以这里不去共线点
  57. for(i=2;i<n;i++)
  58. if(Fabs(x_multi(p[i],p[i-1],p[0])))
  59. p[tot++]=p[i-1];
  60. p[tot++]=p[n-1];*/
  61.  
  62. sta[]=p[],sta[]=p[];
  63. i=top=;
  64. for(i=;i<n;i++)
  65. {
  66. while(top>=&&Fabs(x_multi(p[i],sta[top],sta[top-]))>=)
  67. {
  68. if(top==) break;
  69. top--;
  70. }
  71. sta[++top]=p[i];
  72. }
  73. }
  74.  
  75. /*double allDis(int n,point f)
  76. {
  77. double sum=0.0;
  78. int i;
  79. for(i=0;i<n;i++)
  80. sum+=Dis(p[i],f);
  81. return sum;
  82. }
  83.  
  84. point fermat(int n)
  85. {
  86. double step=0;
  87. int i,j;
  88. for(i=0;i<n;i++)
  89. step+=fabs(sta[i].x)+fabs(sta[i].y);
  90. point f;
  91. f.x=0,f.y=0;
  92. for(i=0;i<n;i++)
  93. f.x+=sta[i].x,f.y+=sta[i].y;
  94. f.x/=n,f.y/=n;
  95. point t;
  96. while(step>1e-10)
  97. {
  98. for(i=0;i<8;i++)
  99. {
  100. t.x=f.x+oper[i][0]*step;
  101. t.y=f.y+oper[i][1]*step;
  102. if(allDis(n,t)<allDis(n,f))
  103. f=t;
  104. }
  105. step/=2;
  106. }
  107. return f;
  108. }
  109. */
  110. int main()
  111. {
  112. int i,j;
  113. while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p[].x,&p[].y,&p[].x,&p[].y,&p[].x,&p[].y,&p[].x,&p[].y))
  114. {
  115. if(p[].x==-&&p[].y==-&&p[].x==-&&p[].y==-&&p[].x==-&&p[].y==-&&p[].x==-&&p[].y==-)
  116. break;
  117. Graham();
  118. double ans;
  119. if(top==)
  120. ans=Dis(sta[],sta[])+Dis(sta[],sta[]);//凸四边形就直接取对角线交点
  121. else
  122. {
  123. ans=1e50;
  124. double sum=;
  125. for(i=;i<;i++)
  126. {
  127. sum=0.0;
  128. for(j=;j<;j++)
  129. if(i!=j)
  130. sum+=Dis(p[i],p[j]);
  131. ans=min(sum,ans);
  132. }
  133. }
  134. printf("%.4lf\n",ans);
  135. }
  136. return ;
  137. }

HDU 2440、HDU 3694多边形费马点的更多相关文章

  1. hdu 4704 Sum(组合,费马小定理,快速幂)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4704: 这个题很刁是不是,一点都不6,为什么数据范围要开这么大,把我吓哭了,我kao......说笑的, ...

  2. HDU 1098 Ignatius's puzzle 费马小定理+扩展欧几里德算法

    题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为 ...

  3. HDU 4704 Sum (隔板原理 + 费马小定理)

    Sum Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/131072K (Java/Other) Total Submiss ...

  4. hdu 4704 Sum【组合数学/费马小定理/大数取模】By cellur925

    首先,我们珂以抽象出S函数的模型:把n拆成k个正整数,有多少种方案? 答案是C(n-1,k-1). 然后发现我们要求的是一段连续的函数值,仔细思考,并根据组合数的性质,我们珂以发现实际上答案就是在让求 ...

  5. hdu 3694 10 福州 现场 E - Fermat Point in Quadrangle 费马点 计算几何 难度:1

    In geometry the Fermat point of a triangle, also called Torricelli point, is a point such that the t ...

  6. 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum

    Sum Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=4704 Mean: 给定一个大整数N,求1到N中每个数的因式分解个数的 ...

  7. HDU 4704 Sum(隔板原理+组合数求和公式+费马小定理+快速幂)

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=4704 Problem Description   Sample Input 2 Sample Outp ...

  8. hdu 4704(费马小定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4704 思路:一道整数划分题目,不难推出公式:2^(n-1),根据费马小定理:(2,MOD)互质,则2^ ...

  9. HDU 5667 Sequence【矩阵快速幂+费马小定理】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意: Lcomyn 是个很厉害的选手,除了喜欢写17kb+的代码题,偶尔还会写数学题.他找到 ...

随机推荐

  1. linux 命令——17 whereis(转)

    whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和 find相比,whereis查找的速度 ...

  2. linux 命令——11 nl (转)

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  3. ZOJ 2112 Dynamic Rankings(二分,树套树)

    动态区间询问kth,单点修改. 区间用线段树分解,线段树上每条线段存一颗平衡树. 不能直接得到kth,但是利用val和比val小的个数之间的单调性,二分值.log^3N. 修改则是一次logN*log ...

  4. noip模拟赛#24

    这套题我只会写第二题...我... T1:给出一个含有向边和无向边的混合图,如何确定无向边的方向使得图中不存在环.保证有解.多解情况输出任意解. =>我往最大流的残量网络的方向去想了...因为混 ...

  5. hdu-1068&&POJ1466 Girls and Boys---最大独立集

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1068 题目大意: 有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人都互相不认识,求该 ...

  6. 问题 M: 克隆玩具

    题目描述 你只有一个A类型玩具,现在有个有两种功能的机器:1. 加工一个A类型的玩具能够再得到一个A类型的玩具和一个B类型的玩具.2. 加工一个B类型的玩具,能得到两个B类型的玩具. 问经过多次加工之 ...

  7. 如何让图片相对于上层DIV始终保持水平、垂直都居中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. python Scraping

    http://docs.python-guide.org/en/latest/scenarios/scrape/

  9. 在mac下使用python抓取数据

    2015已经过去,这是2016的第一篇博文! 祝大家新年快乐! 但是我还有好多期末考试! 还没开始复习,唉,一把辛酸泪! 最近看了一遍彦祖的文章叫做 iOS程序员如何使用Python写网路爬虫 所以自 ...

  10. 稍微深入点理解C++复制控制【转】

    通过一个实例稍微深入理解C++复制控制过程,参考资料<C++ primer>,介绍点基本知识: 1.在C++中类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制复制.赋值和撤销 ...