2-sat+二分搜索hdu(3622)
Bomb Game
put a bomb. The explosion area of the bomb is a circle whose center is just the chosen place. Robbie can control the power of the bomb, that is, he can control the radius of each circle. A strange requirement is that there should be no common area for any
two circles. The final score is the minimum radius of all the N circles.
Robbie has cracked the game, and he has known all the candidate places of each round before the game starts. Now he wants to know the maximum score he can get with the optimal strategy.
that the coordinates of the two candidate places of the i-th round are (x1i, y1i) and (x2i, y2i). All the coordinates are in the range [-10000, 10000].
2
1 1 1 -1
-1 -1 -1 1
2
1 1 -1 -1
1 -1 -1 1
1.41
1.00
题目大题:
给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),
每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸
的范围半径都一样,控制爆炸的半径使得所有的爆炸范围都不相
交(可以相切),求解这个最大半径.
首先二分最大半径值,然后2-sat构图判断其可行性,对于每
两队位置(u,uu)和(v,vv),如果u和v之间的距离小于2*id,也就
是说位置u和位置v处不能同时防止炸弹(两范围相交),所以连边(u,vv)
和(v,uu),求解强连通分量判断可行性.
为了确保精度问题,在计算过程当中先不开方。。。。。
程序:
#include"stdio.h"
#include"string.h"
#include"stack"
#include"math.h"
#define M 209
using namespace std;
stack<int>q;
int head[M],dfn[M],low[M],belong[M],use[M],t,n,index,num,cnt[M];
struct st
{
int u,v,next;
}edge[M*200];
void init()
{
t=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
edge[t].u=u;
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++index;
q.push(u);
use[u]=1;
int i;
for(i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(use[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u])
{
int vv;
num++;
do
{
vv=q.top();
belong[vv]=num;
q.pop();
use[vv]=0;
}while(u!=vv);
}
}
void solve()
{
index=num=0;
memset(dfn,0,sizeof(dfn));
memset(use,0,sizeof(use));
for(int i=1;i<=n*2;i++)
{
if(!dfn[i])
tarjan(i);
}
}
double len(double x1,double y1,double x2,double y2)
{
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main()
{
int i,j;
double x1[M],y1[M],x2[M],y2[M];
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=n;i++)
scanf("%lf%lf%lf%lf",&x1[i],&y1[i],&x2[i],&y2[i]);
double max1=-1;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
double ans=len(x1[i],y1[i],x1[j],y1[j]);
max1=max(max1,ans);
ans=len(x1[i],y1[i],x2[j],y2[j]);
max1=max(max1,ans);
ans=len(x2[i],y2[i],x1[j],y1[j]);
max1=max(max1,ans);
ans=len(x2[i],y2[i],x2[j],y2[j]);
max1=max(max1,ans);
}
}
double left,right,mid;
left=0;
right=max1*2;
while(fabs(right-left)>=0.005)
{ mid=(left+right)/2;
init();
for(i=1;i<=n;i++)
{
for(j=1+i;j<=n;j++)
{
double ans=len(x1[i],y1[i],x1[j],y1[j]);
if(ans<mid)
{
add(i*2-1,j*2);
add(j*2-1,i*2);
}
ans=len(x1[i],y1[i],x2[j],y2[j]);
if(ans<mid)
{
add(2*i-1,2*j-1);
add(2*j,2*i);
}
ans=len(x2[i],y2[i],x1[j],y1[j]);
if(ans<mid)
{
add(2*i,2*j);
add(2*j-1,2*i-1);
}
ans=len(x2[i],y2[i],x2[j],y2[j]);
if(ans<mid)
{
add(2*i,2*j-1);
add(2*j,i*2-1);
}
}
}
solve();
int flag=0;
for(i=1;i<=n;i++)
{
if(belong[i*2-1]==belong[i*2])
{
flag++;
break;
}
}
if(flag)
{
right=mid;
}
else
{
left=mid;
}
}
printf("%.2lf\n",sqrt(mid)/2.0);
}
}
2-sat+二分搜索hdu(3622)的更多相关文章
- HDU 3622 Bomb Game(2-sat)
HDU 3622 Bomb Game 题目链接 题意:求一个最大半径,使得每一个二元组的点任选一个,能够得到全部圆两两不相交 思路:显然的二分半径,然后2-sat去判定就可以 代码: #include ...
- HDU 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3622】Bomb Game
http://acm.hdu.edu.cn/showproblem.php?pid=3622 二分答案转化成2-sat问题. 上午测试时总想二分后把它转化成最大点独立集但是不会写最大点独立集暴力又秘制 ...
- hdu 3622(二分+2-sat判断可行性)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3622 思路:二分是容易想到的,由于题目中有明显的矛盾关系,因此可以用2-sat来验证其可行性.关键是如 ...
- HDU 3622 Bomb Game
Description \(n\) 个炸弹,每个炸弹有两个放置点,可以任选一个,问你最大的半径是多少. Sol 二分+2-SAT+Tarjan. 首先二分一下答案.然后就成了一个2-SAT问题. 建模 ...
- hdu 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 3622 Bomb Game(二分+2SAT)
题意:有一个游戏,有n个回合,每回合可以在指定的2个区域之一放炸弹,炸弹范围是一个圈,要求每回合的炸弹范围没有重合.得分是炸弹半径最小的值.求可以得到的最大分数. 思路:二分+2SAT. 二分炸弹范围 ...
- hdu 3622 二分+2-SAT判定
思路:如题 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio& ...
- Bomb Game HDU - 3622(二分最小值最大化)
题意: 就是给出n对坐标,每对只能选一个,以选出来的点为圆心,半径自定义,画圆,而这些圆不能覆盖,求半径最小的圆的最大值 解析: 看到最x值最x化,那二分变为判定性问题,然后...然后我就没想到... ...
随机推荐
- jQuery EasyUI教程之datagrid应用-1
一.利用jQuery EasyUI的DataGrid创建CRUD应用 对网页应用程序来说,正确采集和管理数据通常很有必要,DataGrid的CRUD功能允许我们创建页面来列表显示和编辑数据库记录.本教 ...
- 关于在Andoird集成开发软件中添加外部jar包的方法
步骤必须是下面的两步,少一步都不行. 第一步是存放于项目中,第二步是导入和应用于项目中. 1.右键项目-Build Path-Configure Build Path-在Libraries目录下-点右 ...
- windows下安装TA-Lib库
步骤一: https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-msvc.zip/download?use_m ...
- 关于IFrame表述正确的有:()
A. 通过IFrame,网页可以嵌入其他网页内容,并可以动态更改 B. 在相同域名下,内嵌的IFrame可以获取外层网页的对象 C. 在相同域名下,外层网页脚本可以获取IFrame网页内的对象 D. ...
- e1087. try/catch语句
The try/catch statement encloses some code and is used to handle errors and exceptions that might oc ...
- Perl Spreadsheet::WriteExcel 模块自动生成excel 文件
Spreadsheet::WriteExcel 是一个跨平台的生成excel文件的模块, 可以方便的设置单元格内容, 样式, sheet 的名称: 但是默认情况下中文会乱码, 需要用Encode模块进 ...
- CentOS运行级别和开机过程
linux运行级别: 1)0:关机 2)1:单用户 3)2:多用户状态没有网络服务 4)3:多用户状态有网络服务 5)4:系统未使用保留给用户 6)5:图形界面 7)6:系统重启 注:常用运行级别是3 ...
- 码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable
近期我也是有点郁闷,究竟是程序中处理关联关系.还是直接使用外键处理关联关系呢?这个的说法不一致!程序中处理这样的关联关系的话.自己去维护这样的约束.这样的非常乐观的一种做法!或者是直接在数据库中处理这 ...
- J2SE基础:8.系统经常使用类二
1:基础数据与封装类型之间的转型 A:基础数据类型--->封装类型(对象类型) Boolean boolean_1 = new Boolean(true); byte ---->Byte ...
- NHibernate之映射文件配置说
1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...