热门标签 | 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


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
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社区 版权所有