热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ZOJ3717Balloon(2SAT)

一个很玄乎的问题,但听到2-SAT之后就豁然开朗了。题目的意思是这样的,给你n个点群,每个点群里面有两个点,你要在每个点群里面选一个点,以这些点做半径为r的圆,然后r会有一个最大值

一个很玄乎的问题,但听到2-SAT之后就豁然开朗了。题目的意思是这样的,给你n个点群,每个点群里面有两个点,你要在每个点群里面选一个点,以这些点做半径为r的圆,然后r会有一个最大值,问的就是怎么选这些点使得r最大。

2-SAT就是对于每个变量有一些制约的关系   a->b
表示选了a就就要选b。然后我们二分这个半径,对于两点间距离<2*r的点(a,b)选了a就不能选b,选了b就不能选a,以此构图。然后跑一次强连通分量。最后判是否有解的时候就是判对于两个属于相同点群的点,它们不能处于同一强连通分量下。写的时候跪的点实在太多了,数组越界呀,强连通写错呀,精度呀,这样的题太坑爹了-
-0





?






1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125


#pragma warning(disable:4996)

#include

#include

#include

#include

#include

#include

#define ll long long

#define maxn 220

#define eps 1e-8

using
namespace std;

 

struct
Point

class="line number14 index13 alt1">{

    double
x, y, z;

    Point(double
xi, double
yi, double
zi) :x(xi), y(yi), z(zi){}

    Point(){}

}p[maxn * 2];

 

double
dist(Point a, Point b){

    return
sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y) + (a.z - b.z)*(a.z - b.z));

class="line number22 index21 alt1">}

 

double
dis[maxn * 2][maxn * 2];

 

int
low[maxn * 2];

int
pre[maxn * 2];

int
dfs_clock;

int
sta[maxn * 2];

int
st;

int
sccno[maxn * 2];

int
n;

vector<int> G[maxn * 2];

int
scc_cnt;

 

int
dcmp(double
x){

    return
(x > eps) - (x <-eps);

class="line number38 index37 alt1">}

 

void
dfs(int
u){

    low[u] = pre[u] = ++dfs_clock;

    sta[++st] = u;

    for
(int i = 0; i

        int
v = G[u][i];

        if
(!pre[v]){

            dfs(v);

            low[u] = min(low[u], low[v]);

        }

        else
if (!sccno[v]){

            low[u] = min(low[u], pre[v]);

        }

    }

    if
(low[u] == pre[u]){

        ++scc_cnt;

        while
(1){

            int
x = sta[st]; st--;

            sccno[x] = scc_cnt;

            if
(x == u) break;

        }

    }

class="line number61 index60 alt2">}

 

bool
judge(double
x)

class="line number64 index63 alt1">{

    memset(sccno, 0, sizeof(sccno));

    memset(pre, 0, sizeof(pre));

    memset(low, 0, sizeof(low));

    st = 0; dfs_clock = 0;

    scc_cnt = 0;

    for
(int i = 0; i <= 2 * n; i++) G[i].clear();

 

    for
(int i = 0; i

        for
(int j = i + 1; j

            if
(dcmp(dis[i][j] - 2 * x) <0){

                G[i].push_back(j + n);

                G[j].push_back(i + n);

            }

            if
(dcmp(dis[i][j + n] - 2 * x) <0){

                G[i].push_back(j);

                G[j + n].push_back(i + n);

            }

            if
(dcmp(dis[i + n][j] - 2 * x) <0){

                G[i + n].push_back(j + n);

                G[j].push_back(i);

            }

            if
(dcmp(dis[i + n][j + n] - 2 * x) <0){

                G[i + n].push_back(j);

                G[j + n].push_back(i);

            }

        }

    }

    for
(int i = 0; i <2 * n; i++){

        if
(!pre[i]) dfs(i);

    }

    for
(int i = 0; i

        if
(sccno[i] == sccno[i + n]) return
false;

    }

    return
true;

class="line number99 index98 alt2">}

 

int
main()

class="line number102 index101 alt1">{

    while
(cin >> n)

    {

        for
(int i = 0; i

            scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);

            scanf("%lf%lf%lf", &p[i + n].x, &p[i + n].y, &p[i + n].z);

        }

        for
(int i = 0; i <2 * n; i++){

            for
(int j = i + 1; j <2 * n; j++){

                dis[i][j] = dis[j][i] = dist(p[i], p[j]);

            }

        }

        double
l = 0, r = 1e10;

        while
(dcmp(r - l)>0){

            double
mid = (l + r) / 2;

            if
(judge(mid)) l = mid;

            else
r = mid;

        }

        int
tmp = l * 1000;

        double
ans = tmp / 1000.0;

        printf("%.3lf\n", ans);

    }

    return
0;

class="line number125 index124 alt2">}

ZOJ3717 Balloon(2-SAT),布布扣,bubuko.com


推荐阅读
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • VPX611是北京青翼科技推出的一款采用6U VPX架构的高性能数据存储板。该板卡搭载两片Xilinx Kintex-7系列FPGA作为主控单元,内置RAID控制器,支持多达8个mSATA盘,最大存储容量可达8TB,持续写入带宽高达3.2GB/s。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 以下实例展示了locals( ... [详细]
  • andr ... [详细]
author-avatar
黄乐瞳_319
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有