C++分治

作者: _弓长_大人 | 来源:发表于2017-01-16 20:49 被阅读12次

题意:二维最近点对

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include <cstring>
using namespace std;
const int N = 100005;
const double INF = 1e20;
struct node{
    double x;
    double y;
}str[N];
double min(double a, double b)
{
    return a < b ? a : b;
}
bool cmp(node a, node b)
{
    if (a.x!=b.x)
        return a.x<b.x;
    return a.y < b.y;
}
int te[N];
int n;
double  dis(int a, int b)
{
    return sqrt((str[a].x - str[b].x)*(str[a].x - str[b].x) + (str[a].y - str[b].y)*(str[a].y - str[b].y));
}
bool cmpp(int a, int b)
{
    return str[a].y < str[b].y;
}
double fun(int left, int right)
{
    double d = INF;
    if (left == right)
    {
        return d;
    }
    if (left + 1 == right)
    {
        return  dis(left, right);
    }
    int mid;
    mid = (left + right) >> 1;
    double d1 = fun(left, mid);
    double d2 = fun(mid + 1, right);
    d = min(d1, d2);
    double d3;
    int i, j, k = 0;
    for (i = left; i <= right; i++)
    {
        if (fabs(str[i].x - str[mid].x) < d)
        {
            te[k++] = i;
        }
    }
    sort(te, te + k, cmpp);
    for (i = 0; i < k; i++)
    {
        for (j = i + 1; j < k&&fabs(str[te[i]].y - str[te[j]].y)<d; j++)
        {
            d3 = dis(te[i], te[j]);
            if (d>d3)
            {
                d = d3;
            }
        }
    }
    return d;
}
int  main()
{
    scanf("%d", &n);
    int i;
    for (i = 0; i < n;i++)
    scanf("%lf %lf", &str[i].x, &str[i].y);
    sort(str, str + n, cmp);
    printf("%.2lf\n", fun(0, n - 1));
    return 0;
}

相关文章

  • C++分治

    题意:二维最近点对

  • 分治策略

    求解递归式方法 最大子数组问题 分治策略 分治法流程 伪代码 C++实现 线性解 流程 代入法求解递归式 递归树法...

  • 八大排序之快速排序

    核心思想:分治 第一种:挖坑法C++: Objective-C: 第二种:指针交换法C++: Objective-...

  • 分治法应用——全排列

    目录 什么是分治法?分析什么是全排列代码(c++)java实现递归结构展示 什么是分治法? 先看分:将一个大问题分...

  • 大数相乘(分治法, C/C++)

    1、分治法 有两点需要理解: (1)分治法基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互...

  • 分治算法

    文章结构 如何理解分治算法 分治算法应用举例 1. 如何理解分治算法 1.1 分治算法的核心思想 分治算法的核心思...

  • 博览网:STL与泛型编程第四周笔记

    简书地址: 1、算法 基本的C++算法分为三类:排序算法、树算法、图算法 算法思想有三种:递推、分治、动态规划 以...

  • 归并排序

    1、分治法 归并排序是完全遵循分治策略的排序算法。什么是分治法? 分治法,即将原问题分解为几个规模较小的子问题,递...

  • 基本算法

    分治 分治分治,即分而治之。分治,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问...

  • 分治

    一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或...

网友评论

      本文标题:C++分治

      本文链接:https://www.haomeiwen.com/subject/qkbpbttx.html