算法题目——最短路径问题(HDU—1007)

题目链接:HDU-1007

前序: 先看一维中的最短路径的计算方式

问题的简单描述:(题意)
在一个笛卡尔系中,n个点分布不一,在这N个点中,求出相距最短的两个点之间的距离

思路:
分治二分法
解题报告:
就是要把N个点x坐标和Y坐标进行排序,然后进行比较!
代码过程:
使用递归分治法解决问题
递归的退出条件:仅当剩余两个顶点时,直接计算出距离。仅剩三个点时,求出任意两点之间的距离,进行比较
进行分治递归:二分法,先将结构体数组分成两份(根据中间点来分)然后递归求d=min(左边s1,右边s2)
点对分别在集合S1和S2中。利用递归分析法分别计算前两种情况,第三种方法另外分析。求解出三类子情况后,
再合并三类情况,比较分析后输出三者中最小的距离。

参考代码:

#include <cstdio>
#include <algorithm>
#include<vector>
#include <cmath>using namespace std;int n;
struct node{double x,y;
}a[100001];int b[100001];double Min(double a,double b)
{return a<b?a:b;
} bool cmpx(node a,node b)
{return a.x<b.x;
}bool cmpy(int A,int B)
{return a[A].y<a[B].y;
}double Distance(node a,node b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}//参数:s 是结构体数组的开始(0),e是结构体数组的长度(n-1) 
double closestPoint(int s,int e)//求得是直径 
{if(e-s==1)//仅有两个点时 return Distance(a[s],a[e]);//求得是直径 if(e-s==2)//仅三个点时 return Min(Distance(a[s],a[s+1]),Min(Distance(a[s+1],a[e]),Distance(a[s],a[e])));int mid=(s+e)/2;int index=0;double d=Min(closestPoint(s,mid),closestPoint(mid+1,e));//分成前面一段,后面一段 得到最小直径 for(int i=s;i<=e;i++){if(a[i].x>=a[mid].x-d&&a[i].x<=a[mid].x+d)//即当有一个点到中间结点的距离小于两段最短距离d时//至少是直角边小于d,才有可能斜边有机会出现小于d b[index++]=i;//记录的下标 }sort(b,b+index,cmpy);//将记录的下标数据按照Y轴进行排序 //有个原理说明了这个下标序列最多有六个点 for(int i=0;i<index;i++){for(int j=i+1;j<index&&j<=i+7;j++)//因为最多有6个点,又因为结构体的起点是从1开始的 {if(a[b[j]].y-a[b[i]].y>=d)//如果y轴,该结点到中间结点的距离大于d时 break;d=Min(d,Distance(a[b[i]],a[b[j]]));//如果y轴,该结点到中间结点的距离小于d时 }}return d;
}int main()
{vector<double> vec;while(scanf("%d",&n)!=EOF&&n!=0){for(int i=0;i<n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);sort(a,a+n,cmpx);vec.push_back(closestPoint(0,n-1)/2.0);}for(int i=0;i<vec.size();i++){printf("%.2lf\n",vec[i]);}return 0;
} 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有Kubernets,学习Docker还有用吗?

Docker容器化和Kubernetes容器编排&#xff0c;作为微服务和云原生的核心依赖&#xff0c;这几年已是大红大紫全民皆知。然而近日Kubernetes官方发布公告&#xff0c;宣布自 v1.20 起放弃对 Docker 的支持&#xff0c;惊呆了一众开发者。在这背后&#xff0c;究竟是人性的扭曲&…

oracle 查看函数被哪些触发器引用_oracle如何查看存储过程,存储函数,触发器的具体内容...

(1)set serveroutput on实现plsql developer 打印输出(2)如何查看存储过程&#xff0c;存储函数&#xff0c;触发器的内容查 user_sources表eg&#xff1a;查询GET_DEPT_SUMSAL这个存储函数的内容SQL> desc user_source名称 是否为空? 类型-------------------------------…

算法题目——二次函数三分求极值(HDU-3714)

题目链接&#xff1a;HDU-3714 题目描述&#xff1a; 对于N个二次函数&#xff0c;求每个二次函数的最小值中的最大值 思路&#xff1a; 使用三分法求极值&#xff08;递归调用&#xff09; 对于这种在指定区间里只有一个极值点的函数&#xff08;凸函数凹函数都可以&#xff…

怎样才能去掉图片锁定纵横比_1分钟批量统一Word中300张图片的大小!无需插件、代码,超级简单...

很多时候我们需要将在Word中插入很多张图片&#xff0c;插入完成之后&#xff0c;一般我们还要统一它们的大小&#xff0c;如果是少量的图片的话&#xff0c;我们可以一个一个选择&#xff0c;然后再进行设置。或者先设置好一张图片后&#xff0c;再通过【F4】键&#xff0c;进…

我国火力发电站的大脑用上了国产系统

近年来&#xff0c;我国核电、水电、风电、光伏产业发展迅速&#xff0c;但从发电总量来看&#xff0c;火电依然占据7成以上的发电比例。水电、风电、光伏等清洁能源受自然条件限制&#xff0c;只能成为火电的有效补充&#xff0c;而不可能取代火电。而福岛核事故、切尔诺贝利核…

require 动态加载_require,exports,module.exports和import,export,export default

我们前端在开发过程中经常会遇到导入导出功能&#xff0c;在导入时&#xff0c;有时候是require&#xff0c;有时候是import在导出时&#xff0c;有时候是exports&#xff0c;module.exports&#xff0c;有时候是export&#xff0c;export default今天我们对这些内容进行简单的…

Newbe.ObjectVisitor 0.4.4 发布,模型验证器上线

Newbe.Claptrap 0.4.4 发布&#xff0c;模型验证器上线。更新内容完全基于表达式树的模型验证器本版本&#xff0c;我们带来了基于表达式树实现的模型验证器。并实现了很多内置的验证方法。我们罗列了与 FluentValidation 比较的情况&#xff1a;Build in ValidatorsFluentVali…

算法题目中经典问题(易错点)

算法题目中经典问题.易错点 (一).二维数组的传参问题1.方法一:形参为二维数组并给定第二维长度2.方法二:形参为指向数组的指针并给出数组长度3.二维数组定义为全局变量(二).多组测试控制台数据,输入到文件结束(三).进制转换中的小问题1.使用字符串来存储,每一位(四).结构体…

dotnet core 应用是如何跑起来的 通过AppHost理解运行过程

在 dotnet 的输出路径里面&#xff0c;可以看到有一个有趣的可执行文件&#xff0c;这个可执行文件是如何在框架发布和独立发布的时候&#xff0c;找到 dotnet 程序的运行时的&#xff0c;这个可执行文件里面包含了哪些内容在回答上面的问题之前&#xff0c;请大家尝试打开 C:\…

算法题目——整数划分(HRBUST-2004)

题目链接&#xff1a;HRBUST-2004 递归法: 1.当n1时&#xff0c;此时只有1种解{1}; 2.当m1时&#xff0c;此时也只有1种解{1,1,1, … 3.当n> m时&#xff0c;要分为最大数包含m和不包含m两种情况。 ●包含m:此时就是{mx1,2…}. 其中x1x23.… n-m, 就相当于求和为n-m,最…

dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程

在上一篇博客是使用官方提供的 AppHost 跑起来整个 dotnet 程序。本文告诉大家在 dotnet 程序运行到托管代码之前&#xff0c;所需要的 Native 部分的逻辑。包括如何寻找 dotnet 运行时&#xff0c;如何加载运行时和框架然后跑起来业务端的 dll 文件的逻辑在上一篇博客告诉大家…

android虚线边框_Android实现代码画虚线边框背景效果

实现如下边框效果&#xff1a;虚线画效果&#xff0c;可以使用Android中的xml来做。下面话不多说&#xff0c;直接上代码&#xff1a;android:id"id/coupon_popup"android:layout_width"320dp"android:layout_height"200dp"android:layout_margi…

算法题目——多米诺骨牌问题(POJ-2663)

题目链接&#xff1a;POJ-2663 设有形状一样的多米诺牌&#xff0c;每张牌恰好覆盖棋盘上相邻的两个方格&#xff0c;即一张多米诺牌是一张 1 行 2 列或者 2 行 1 列的牌。那么&#xff0c;是否能够把 32 张多米诺牌摆放到棋盘上&#xff0c;使得任何两张多米诺牌均不重叠&…

【招聘(上海)】 坚果云 招聘Windows客户端(WPF方向)

岗位职责&#xff1a;1、负责坚果云在Windows 10平台上WPF应用的开发与维护&#xff1b;2、负责基于WPF的Windows平台核心客户端产品开发&#xff0c;维护与测试&#xff1b;3、WPF桌面应用将具备丰富的文件展示和文件管理功能&#xff0c;其中与操作系统交互&#xff0c; 复杂…

三相全桥整流电路_三相桥式全控整流电路

收稿日期:2002-04-12作者简介:陈强(1976—),男,硕士研究生1三相桥式全控整流及单相交流调压实验装置的研制陈强,杨旭,王兆安(西安交通大学电气工程学院,西安710049)摘要:本文结合具体的三相全控整流电路的研制,介绍了以国产集成芯片KJ004和KJ041为中心的触发电路的工作过程及主…

算法题目——Problem A 二进制(北邮机试)

Problem A 二进制 题目描述 32位二进制数 X ,对其进行X+1,X+3操作,并输出。注意不能忽略前导0。 输入 第一行,一个整数 T ,代表测试数据组数。接着 T 行,输入32为二进制数输出对每组测试数据。 输出 两行,第一行为X+1,第二行为X+3. 测试样例 输入 2 00000000000000000000…

merge函数_c语言中的merge函数

展开全部merge()是C标准库的函数&#xff0c;主要实现函数的排序和合并&#xff0c;不仅仅是合并&#xff0c;具体要求参e5a48de588b63231313335323631343130323136353331333431373261照标准库。#include"stdafx.h"#include#include#include#includeusingnamespacest…

算法题目——求众数

在c中有两个关联容器&#xff0c; 第一种是map&#xff0c;内部是按照key排序的&#xff0c;从小到大 第二种是unordered_map&#xff0c;容器内部是无序的&#xff0c;使用hash组织内容的。 #include<iostream> #include<map> #include<algorithm> using n…

2020武汉dotNET俱乐部分享交流会圆满结束

经过长达2个多月的准备&#xff0c;终于在12月5日圆满的举行了武汉首次dotNET俱乐部线下分享交流活动。我们一共精心准备了3个目前比较热门的主题&#xff0c;分别如下&#xff1a;Jason分享的《ABP开发框架的扩展应用》Leo分享的《基于Kubernetes的DevOps平台应用》Eleven分享…

r语言remarkdown展示图_R语言—自动报告Markdown笔记

一句话介绍&#xff1a;Markdown是一种轻量级标记语言&#xff0c;内容是代码与文本的混合&#xff0c;类似HTML,但语法比HTML简单。&、比如&#xff1a;如果你写&#xff1a; 4<5 ,Markdown将会把他转换为&#xff1a; 4<5换行符&#xff1a;在Markdown中依然使用&a…