ZOJ 1450

最小圆覆盖

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;
const double eps=0.00000001;
struct point {
	double x,y;
}p[110];

struct circle{
	point cent;
	double rad;
}cir;
int n;

double TriangleArea(point t1,point t2,point t3){
	point p1,p2;
	p1.x=t1.x-t3.x; p1.y=t1.y-t3.y;
	p2.x=t2.x-t3.x; p2.y=t2.y-t3.y;
	return fabs(p1.x*p2.y-p2.x*p1.y)/2;
}

double dist(point p1,point p2){
	return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

void TriangleCircle(point ta,point tb,point tc){
	double a=dist(ta,tb);
	double b=dist(tb,tc);
	double c=dist(tc,ta);
	cir.rad=(a*b*c)/TriangleArea(ta,tb,tc)/4;
	double xa=ta.x; double ya=ta.y;
	double xb=tb.x; double yb=tb.y;
	double xc=tc.x; double yc=tc.y;
	double c1=(xa*xa+ya*ya-xb*xb-yb*yb)/2;
	double c2=(xa*xa+ya*ya-xc*xc-yc*yc)/2;
	cir.cent.x=(c1*(ya-yc)-c2*(ya-yb))/((xa-xb)*(ya-yc)-(xa-xc)*(ya-yb));
	cir.cent.y=(c1*(xa-xc)-c2*(xa-xb))/((ya-yb)*(xa-xc)-(ya-yc)*(xa-xb));
}

void slove(){
	random_shuffle(p,p+n);
	cir.cent=p[0]; cir.rad=0;
	for(int i=1;i<n;i++){
		if(dist(p[i],cir.cent)-eps>cir.rad	){
			cir.cent=p[i]; cir.rad=0;
			for(int j=0;j<i;j++){
				if(dist(p[j],cir.cent)-eps>cir.rad	){
					cir.cent.x=(p[j].x+p[i].x)/2;
					cir.cent.y=(p[i].y+p[j].y)/2;
					cir.rad=dist(p[j],p[i])/2;
					for(int k=0;k<j;k++){
						if(dist(p[k],cir.cent)-eps>cir.rad	){
							TriangleCircle(p[i],p[j],p[k]);
						}
					}
				}
			}
		}
	}
}

int main(){
	while(scanf("%d",&n)!=EOF){
		if(n==0) break;
		for(int i=0;i<n;i++){
			scanf("%lf%lf",&p[i].x,&p[i].y);
		}
		slove();
		printf("%0.2f %0.2f %0.2f\n",cir.cent.x,cir.cent.y,cir.rad);
	}
	return 0;
}

  

ZOJ 1450,布布扣,bubuko.com

时间: 2024-10-26 18:27:29

ZOJ 1450的相关文章

ZOJ 1450 Minimal Circle 最小圆覆盖

套了个模板直接上,貌似没有随机化序列 QAQ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <cstring> #include <cmath> #include <stack> #include <queue> #include <

zoj 1450 Minimal Circle 最小覆盖圆

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=450 You are to write a program to find a circle which covers a set of points and has the minimal area. There will be no more than 100 points in one problem. 题意描述:找到一个最小圆能够包含到所有的二维坐标点. 算法

ZOJ 1450 HDU 3007 (最小圆覆盖)

首先这个圆边上必有至少两点,打乱数组,然后利用枚举,不断重新定义圆,找出最小的圆 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int N = 100005; const double eps = 1e-8; int n; struct Point { double x, y; Point()

计算几何学习8

由于poj炸了 而题单上有很多poj的题 就先开始第二部分了 学习了两个固定算法 最小圆覆盖和平面上最近点对 平面上最近点对采用的是分治的思想 把一个x有序的序列分成A,B左右两部分 当得到A内最近点对距离,B类最近点对距离后 先更新大序列的答案ans A,B间最近点对的产生 显然在x坐标距离mid点不超过ans的区间内产生 我们把这段区间拿出来,对y排序 再逐对更新 值得注意的地方 1)为了确保速度 可以在第二次对y排序的时候采取对标号排序的方式 2)在枚举点对更新的时候注意在y差值 >= a

计算几何及其应用——解析几何

写在前面:刚学专业课的时候,记得有天突发奇想,心说高三数学的压轴题能不能写个程序跑出答案,这样岂不是解放了数万苦逼高三生的双手?但是当时也仅仅是停留在想法上面,因为高中的解析几何虽然步骤程序化,但是有时候需要灵巧的因式分解,感觉以目前的编程水平还是写不出来,但是了解到数学有一个分支——计算几何,专门利用计算机来进行几何计算的一门科学,并且还与计算机图形学.计算机视觉和图像处理.机器人.计算机辅助设计和制造等高深学科有着联系(摘自<计算几何与应用>导言),所以今天怀着激动的心情开始了这个专题的学

计算几何题目分类

转载 一.基础题目 1.1 有固定算法的题目 A, 最近点对问题最近点对问题的算法基于扫描线算法.ZOJ 2107    Quoit Design    典型最近点对问题POJ    3714    Raid    变种最近点对问题 B,最小包围圆最小包围圆的算法是一种增量算法,期望是O(n).ZOJ    1450    Minimal Circle  HDU    3007    Buried memory C,旋转卡壳POJ 3608    Bridge Across Islands   

概率dp ZOJ 3640

Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3640 Appoint description:  System Crawler  (2014-10-22) Description Background     If thou doest well, shalt thou not be accepted? an

zoj 2156 - Charlie&#39;s Change

题目:钱数拼凑,面值为1,5,10,25,求组成n面值的最大钱币数. 分析:dp,01背包.需要进行二进制拆分,否则TLE,利用数组记录每种硬币的个数,方便更新. 写了一个 多重背包的 O(NV)反而没有拆分快.囧,最后利用了状态压缩优化 90ms: 把 1 cents 的最后处理,其他都除以5,状态就少了5倍了. 说明:貌似我的比大黄的快.(2011-09-26 12:49). #include <stdio.h> #include <stdlib.h> #include <

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio