HDU-3622 Bomb Game 2sat
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3622
题意:一个平面上有很多的炸弹,每个炸弹的爆炸范围是一样的,求最大的爆炸范围使得炸弹之间不相互影响。
二分爆炸范围,然后建立2sat模型,看是否存在解。
1 //STATUS:C++_AC_171MS_972KB 2 #include <functional> 3 #include <algorithm> 4 #include <iostream> 5 //#include <ext/rope> 6 #include <fstream> 7 #include <sstream> 8 #include <iomanip> 9 #include <numeric> 10 #include <cstring> 11 #include <cassert> 12 #include <cstdio> 13 #include <string> 14 #include <vector> 15 #include <bitset> 16 #include <queue> 17 #include <stack> 18 #include <cmath> 19 #include <ctime> 20 #include <list> 21 #include <set> 22 #include <map> 23 using namespace std; 24 //using namespace __gnu_cxx; 25 //define 26 #define pii pair<int,int> 27 #define mem(a,b) memset(a,b,sizeof(a)) 28 #define lson l,mid,rt<<1 29 #define rson mid+1,r,rt<<1|1 30 #define PI acos(-1.0) 31 //typedef 32 typedef long long LL; 33 typedef unsigned long long ULL; 34 //const 35 const int N=210; 36 const int INF=0x3f3f3f3f; 37 const int MOD=5000,STA=100010; 38 const LL LNF=1LL<<60; 39 const double EPS=1e-8; 40 const double OO=1e15; 41 const int dx[4]={-1,0,1,0}; 42 const int dy[4]={0,1,0,-1}; 43 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 44 //Daily Use ... 45 inline int sign(double x){return (x>EPS)-(x<-EPS);} 46 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} 47 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} 48 template<class T> inline T lcm(T a,T b,T d){return a/d*b;} 49 template<class T> inline T Min(T a,T b){return a<b?a:b;} 50 template<class T> inline T Max(T a,T b){return a>b?a:b;} 51 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);} 52 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);} 53 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));} 54 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));} 55 //End 56 57 double d[N][N]; 58 int nod[N][2]; 59 int first[N],next[N*N*2],vis[N],S[N]; 60 int n,mt,cnt; 61 62 struct Edge{ 63 int u,v; 64 }e[N*N*2]; 65 66 double dist(int i,int j){ 67 return sqrt((double)((nod[i][0]-nod[j][0])*(nod[i][0]-nod[j][0])+ 68 (nod[i][1]-nod[j][1])*(nod[i][1]-nod[j][1]))); 69 } 70 71 void adde(int a,int b) 72 { 73 e[mt].u=a,e[mt].v=b; 74 next[mt]=first[a];first[a]=mt++; 75 } 76 77 int dfs(int u) 78 { 79 if(vis[u^1])return 0; 80 if(vis[u])return 1; 81 int i; 82 vis[u]=1; 83 S[cnt++]=u; 84 for(i=first[u];i!=-1;i=next[i]){ 85 if(!dfs(e[i].v))return 0; 86 } 87 return 1; 88 } 89 90 int Twosat() 91 { 92 int i,j; 93 for(i=0;i<n;i+=2){ 94 if(vis[i] || vis[i^1])continue; 95 cnt=0; 96 if(!dfs(i)){ 97 while(cnt)vis[S[--cnt]]=0; 98 if(!dfs(i^1))return 0; 99 } 100 } 101 return 1; 102 } 103 104 void init(double limt) 105 { 106 int i,j; 107 mt=0;mem(vis,0); 108 mem(first,-1); 109 for(i=0;i<n;i++){ 110 for(j=i+2;j<n;j++)if(d[i][j]<limt)adde(i,j^1),adde(j,i^1); 111 i++; 112 for(j=i+1;j<n;j++)if(d[i][j]<limt)adde(i,j^1),adde(j,i^1); 113 } 114 } 115 116 double binary(double l,double r) 117 { 118 double mid; 119 while(fabs(l-r)>EPS){ 120 mid=(l+r)/2; 121 // printf("%.2lf %.2lf %.2lf\n",l,r,mid); 122 init(mid); 123 if(Twosat())l=mid; 124 else r=mid; 125 } 126 return mid; 127 } 128 129 int main() 130 { 131 // freopen("in.txt","r",stdin); 132 int i,j; 133 double hig; 134 while(~scanf("%d",&n)) 135 { 136 n<<=1; 137 for(i=0;i<n;i+=2){ 138 scanf("%d%d%d%d",&nod[i][0],&nod[i][1],&nod[i^1][0],&nod[i^1][1]); 139 } 140 hig=0; 141 for(i=0;i<n;i++){ 142 for(j=i+1;j<n;j++){ 143 d[i][j]=d[j][i]=dist(i,j); 144 hig=Max(hig,d[i][j]); 145 } 146 } 147 148 printf("%.2lf\n",binary(0,hig)/2); 149 } 150 return 0; 151 }
转载于:https://www.cnblogs.com/zhsl/p/3175914.html
HDU-3622 Bomb Game 2sat相关推荐
- HDU 3622 Bomb Game / 2-SAT
刚刚学 看到很多网上和书上有直接逐点判断的dfs暴力算法 加上今天事情特别多 看了半天 也可以用tarjan判断 这个有空在学 题意不用说了吧 就是求一个半径 n个炸弹吧 每个可以选择2个点之中的一个 ...
- hdu 3622 Bomb Game【二分+2-SAT+tarjan】
用read()会挂 二分半径,显然最优的是所有原都用这个最小半径,然后2-SAT把相交的圆建图,跑tarjan判一下可行性即可 #include<iostream> #include< ...
- hdu 3622 二分+2-sat
/* 二分+2-sat 题意:在一个二维平面上给你n个炸弹,和2*n个位置,每一行的两个位置仅仅能有一个放炸弹 如今炸弹爆炸有一个半径.当炸弹爆炸时两个炸弹的半径化成的圆不能相交,求最大半径 二分半径 ...
- [2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421
文章目录 Priest John's Busiest Day code Peaceful Commission code Let's go home code Bomb Game code Elimi ...
- HDU 3555 Bomb(数位DP模板啊两种形式)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...
- HDU 3555 Bomb (数位DP-记忆化搜索模板)
题意 求区间[1,n]内含有相邻49的数. 思路 比较简单的按位DP思路.这是第一次学习记忆化搜索式的数位DP,确实比递推形式的更好理解呐,而且也更通用~可以一般化: [数位DP模板总结] int d ...
- hdu 3062 基础的2sat
题意: Party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 3062 Party(2-sat题模板+tarjan )
题目: 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的.有没有可 ...
- HDU 3555 Bomb (数位DP)
数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数,它是按位来进行计数统计的,可以保存子状态,速度较快.数位dp做多了后,套路基本上都差不多,关键把要保存的状态给抽象出来,保存下 ...
最新文章
- 转:去掉Flex4生成的SWF加载时的进度条
- 如何将Twitter的内容导入到SAP CRM和C4C
- [网络安全自学篇] 三十六.WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动劫持机理
- linux php和java环境变量配置_Linux下Java环境变量的安装与配置
- 踏上Silverlight的征程 体验Silverlight之美
- 一次性解决导航栏的所有问题
- 爬虫实例九 豆瓣电影详情信息
- SQL Server常用的字符串/日期/系统函数
- cl.exe nmake.exe
- Java加密:四、非对称加密算法
- 新手必看的入门编程教程
- c语言实验报告评语大全,实验报告总结
- 在线excel表格,支持协同编辑
- 计算机控制系统机器人,机器人的控制系统
- 数据结构基础— How Long Does It Take
- 【操作系统-Windows】杀毒软件工作原理 及 现在主要杀毒技术
- 计算机配置内存在哪看,从哪里看电脑配置
- 第15章卡方检验:拟合优度和独立性检验
- Unity3D 制作游戏简单“跑马灯”功能
- Hierarchical Z-Buffer Visibility (Hi-Z)
热门文章
- C语言运算符优先级列表
- Linux newgrp命令用法详解:切换用户的有效组
- html5_0_文章_分级_分段
- 概率论-3.5 条件分布与条件期望
- android怎么实现标题搜索,Android Toolbar上SearchView的实现
- 无法将文件ftp服务器上,ftp服务器上传不了文件
- JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat
- IE8“开发人员工具”使用详解上(各级菜单详解)
- OGNL是Object-Graph Navigation Language
- Oracle中如何插入特殊字符: 和 ' (多种解决方案)