http://acm.hdu.edu.cn/showproblem.php?pid=3622

对半径进行二分,如果冲突则加入边(按照X AND Y == 0的法则插入边),再2-SAT即可。

  1 //#pragma comment(linker, "/STACK:102400000,102400000")
  2 #include<cstdio>
  3 #include<iostream>
  4 #include<cstring>
  5 #include<string>
  6 #include<cmath>
  7 #include<set>
  8 #include<list>
  9 #include<map>
 10 #include<iterator>
 11 #include<cstdlib>
 12 #include<vector>
 13 #include<queue>
 14 #include<stack>
 15 #include<algorithm>
 16 #include<functional>
 17 using namespace std;
 18 typedef long long LL;
 19 #define ROUND(x) round(x)
 20 #define FLOOR(x) floor(x)
 21 #define CEIL(x) ceil(x)
 22 const int maxn=210;
 23 const int inf=0x3f3f3f3f;
 24 const LL inf64=0x3f3f3f3f3f3f3f3fLL;
 25 const double INF=1e30;
 26 const double eps=1e-6;
 27 int N;
 28 struct Point
 29 {
 30     double x,y;
 31 }p[maxn];
 32 struct TwoSAT
 33 {
 34     int n;
 35     vector<int> G[maxn*2];
 36     bool mark[maxn*2];
 37     int S[maxn*2], c;
 38     bool dfs(int x)
 39     {
 40         if (mark[x^1]) return false;
 41         if (mark[x]) return true;
 42         mark[x] = true;
 43         S[c++] = x;
 44         for (int i = 0; i < G[x].size(); i++)
 45             if (!dfs(G[x][i])) return false;
 46         return true;
 47     }
 48     void init(int n)
 49     {
 50         this->n = n;
 51         for (int i = 0; i < n*2; i++) G[i].clear();
 52         memset(mark, 0, sizeof(mark));
 53     }
 54     void add_and_zero(int x,int y)
 55     {
 56         G[x].push_back(y^1);
 57         G[y].push_back(x^1);
 58     }
 59     bool solve()
 60     {
 61         for(int i = 0; i < n*2; i += 2)
 62             if(!mark[i] && !mark[i+1])
 63             {
 64                 c = 0;
 65                 if(!dfs(i))
 66                 {
 67                     while(c > 0) mark[S[--c]] = false;
 68                     if(!dfs(i+1)) return false;
 69                 }
 70             }
 71         return true;
 72     }
 73 };
 74 TwoSAT sat;
 75 double dist(Point A,Point B)
 76 {
 77     return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
 78 }
 79 void init()
 80 {
 81     sat.init(N);
 82 }
 83 void input()
 84 {
 85     for(int i=0;i<N;i++)
 86         scanf("%lf%lf%lf%lf",&p[2*i].x,&p[2*i].y,&p[2*i+1].x,&p[2*i+1].y);
 87 }
 88 void solve()
 89 {
 90     double L=0.0,R=40000.0;
 91     while(fabs(R-L)>=eps)
 92     {
 93         double M=(L+R)/2;
 94         sat.init(N);
 95         for(int i=0;i<2*N-2;i++)
 96             for(int j=(i%2==0)? i+2:i+1;j<2*N;j++)
 97                 if(dist(p[i],p[j])<M) sat.add_and_zero(i,j);
 98         if(sat.solve()) L=M;
 99         else R=M;
100     }
101     printf("%.2f\n",R/2);
102 }
103 int main()
104 {
105 //    freopen("in.cpp","r",stdin);
106     while(~scanf("%d",&N))
107     {
108         init();
109         input();
110         solve();
111     }
112     return 0;
113 }

View Code

转载于:https://www.cnblogs.com/xysmlx/p/3257479.html

HDU 3622 Bomb Game相关推荐

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

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

  2. HDU 3622 Bomb Game / 2-SAT

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

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

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

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

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

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

  6. HDU 3555 Bomb (数位DP)

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

  7. HDU 3555: Bomb

    ///@link http://acm.hdu.edu.cn/showproblem.php?pid=3555///@author Sycamore///@date Sep, 14///@ref ku ...

  8. hdu 3622 二分+2-sat

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

  9. HDU 3555 Bomb

    模板题 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll num; int a[20],len; ...

  10. HDU - 3555 Bomb(数位dp)

    题目链接:点击查看 题目大意:给定一个整数n,求从1到n的闭区间内含有相邻"49"的数字的个数. 题目分析:裸的数位dp,这里说一下两种做法,第一种是正着求,也就是求含有49的数字 ...

最新文章

  1. bzoj1150 [CTSC2007]数据备份Backup
  2. [转] Mysql命令基础
  3. C#基础:理解装箱与拆箱
  4. 口琴膜片什么作用_思域发动机舱里的这个东西是什么东东,它究竟有什么作用呢?...
  5. Python获取文件夹下的所有文件名
  6. SQL FILESTREAM和SQL Server全文搜索
  7. input数字开头不能为0_Python新手上车5:数字和注释
  8. 计算机电缆静电,ZR-DJFPVP计算机电缆
  9. SQL server增删改查
  10. Matlab - 演化博弈论实现
  11. Linux 下修改数据库密码
  12. 关于字体的px和pt
  13. unity 导入mixamo动画材质设置
  14. ASF网站自带python脚本完成sentinel-1数据自动下载
  15. 信息系统项目管理师2019年下半年上午试题解析(三)
  16. 【提交】commit
  17. CES 2018前瞻:家居/音箱/AR/汽车都有什么新玩法 | 关注
  18. .net 连接ORACLE中文显示乱码解决方案
  19. 用python计算图形面积问题(蒙特卡罗)
  20. Unable to paint on Qt Widget, shows error “paintEngine: Should no longer be called”

热门文章

  1. LayaAir 定时器 Timer
  2. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_23-CMS前端页面查询开发-分页查询实现...
  3. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-2.中大型公司里面项目开发流程讲解...
  4. ActiveMQ学习笔记(1)----初识ActiveMQ
  5. 使用octave符号运算求解不定积分、微分方程等(兼容matlab)
  6. P2326 AKN’s PPAP
  7. 有用的linux命令笔记
  8. 推荐几款好用的CRM
  9. Android-将RGB彩色图转换为灰度图
  10. 潭州课堂25班:Ph201805201 tornado 项目 第三课 项目 图片上传,展示 (课堂笔记)...