题目链接: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相关推荐

  1. HDU 3622 Bomb Game / 2-SAT

    刚刚学 看到很多网上和书上有直接逐点判断的dfs暴力算法 加上今天事情特别多 看了半天 也可以用tarjan判断 这个有空在学 题意不用说了吧 就是求一个半径 n个炸弹吧 每个可以选择2个点之中的一个 ...

  2. hdu 3622 Bomb Game【二分+2-SAT+tarjan】

    用read()会挂 二分半径,显然最优的是所有原都用这个最小半径,然后2-SAT把相交的圆建图,跑tarjan判一下可行性即可 #include<iostream> #include< ...

  3. hdu 3622 二分+2-sat

    /* 二分+2-sat 题意:在一个二维平面上给你n个炸弹,和2*n个位置,每一行的两个位置仅仅能有一个放炸弹 如今炸弹爆炸有一个半径.当炸弹爆炸时两个炸弹的半径化成的圆不能相交,求最大半径 二分半径 ...

  4. [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 ...

  5. HDU 3555 Bomb(数位DP模板啊两种形式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...

  6. HDU 3555 Bomb (数位DP-记忆化搜索模板)

    题意 求区间[1,n]内含有相邻49的数. 思路 比较简单的按位DP思路.这是第一次学习记忆化搜索式的数位DP,确实比递推形式的更好理解呐,而且也更通用~可以一般化: [数位DP模板总结] int d ...

  7. hdu 3062 基础的2sat

    题意: Party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. HDU 3062 Party(2-sat题模板+tarjan )

    题目: 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的.有没有可 ...

  9. HDU 3555 Bomb (数位DP)

    数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数,它是按位来进行计数统计的,可以保存子状态,速度较快.数位dp做多了后,套路基本上都差不多,关键把要保存的状态给抽象出来,保存下 ...

最新文章

  1. 转:去掉Flex4生成的SWF加载时的进度条
  2. 如何将Twitter的内容导入到SAP CRM和C4C
  3. [网络安全自学篇] 三十六.WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动劫持机理
  4. linux php和java环境变量配置_Linux下Java环境变量的安装与配置
  5. 踏上Silverlight的征程 体验Silverlight之美
  6. 一次性解决导航栏的所有问题
  7. 爬虫实例九 豆瓣电影详情信息
  8. SQL Server常用的字符串/日期/系统函数
  9. cl.exe nmake.exe
  10. Java加密:四、非对称加密算法
  11. 新手必看的入门编程教程
  12. c语言实验报告评语大全,实验报告总结
  13. 在线excel表格,支持协同编辑
  14. 计算机控制系统机器人,机器人的控制系统
  15. 数据结构基础— How Long Does It Take
  16. 【操作系统-Windows】杀毒软件工作原理 及 现在主要杀毒技术
  17. 计算机配置内存在哪看,从哪里看电脑配置
  18. 第15章卡方检验:拟合优度和独立性检验
  19. Unity3D 制作游戏简单“跑马灯”功能
  20. Hierarchical Z-Buffer Visibility (Hi-Z)

热门文章

  1. C语言运算符优先级列表
  2. Linux newgrp命令用法详解:切换用户的有效组
  3. html5_0_文章_分级_分段
  4. 概率论-3.5 条件分布与条件期望
  5. android怎么实现标题搜索,Android Toolbar上SearchView的实现
  6. 无法将文件ftp服务器上,ftp服务器上传不了文件
  7. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat
  8. IE8“开发人员工具”使用详解上(各级菜单详解)
  9. OGNL是Object-Graph Navigation Language
  10. Oracle中如何插入特殊字符: 和 ' (多种解决方案)