NOI2011 智能车比赛

SPFA。

我们关键是要找到关键点,包括起点,终点,和相邻矩形接触线段的上端点和下端点(如图有红色圈住的点为关键点)。

我们要做的就是在这些关键点之间连边。

我们把这些关键的点拿出来:

其实就是一些竖直的线段。

除了S和T外,从左到右或者从右到左穿过线段所在的直线,必须在线段中穿过去,也就是说有个上边界和下边界。

如图是S到第4条竖直的线段的上边界l1和下边界l2。

我们先按X坐标从小到大排序,枚举边的起点,向左或者向右连边,如果遇到竖直的线段,用叉积更改上下边界即可。

构好图就直接SPFA即可。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>using namespace std;const int maxN=2000;
const double INF=1e15;
const double EPS=1e-9;inline int dblcmp(double x){if (abs(x)<EPS)return 0;return x>0?1:-1;}
inline double sqr(double x){return x*x;}struct Tpoint{double x,y;inline Tpoint(){}inline Tpoint(double _x,double _y){x=_x;y=_y;}};inline double dis(Tpoint a,Tpoint b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
inline double det(Tpoint p0,Tpoint p1,Tpoint p2){return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);}int N;
Tpoint square[maxN+100][2];
Tpoint a[maxN+100][2];
int id[maxN+100][2],cnt;
int now,info[2*maxN+100];
struct Tedge{int v,next;double dis;}edge[2*maxN*2*maxN+1000];
double ans,v;
Tpoint S,T;
int eS,eT,idS,idT;inline void addedge(int u,int v,double dis){now++;edge[now].v=v;edge[now].dis=abs(dis);edge[now].next=info[u];info[u]=now;}inline void solve(Tpoint s,int num,int l){if (num!=idS && num!=idT && num%2==0){addedge(num,num+1,dis(a[l][0],a[l][1]));addedge(num+1,num,dis(a[l][0],a[l][1]));}Tpoint low,high,t1,t2;bool flag=0;for(int i=l-1;i>=1;i--){if (!flag && (id[i][0]==idS || id[i][0]==idT)){addedge(num,id[i][0],dis(s,a[i][0]));addedge(id[i][0],num,dis(s,a[i][0]));continue;}if (!flag){addedge(num,id[i][0],dis(s,a[i][0]));addedge(id[i][0],num,dis(s,a[i][0]));addedge(num,id[i][1],dis(s,a[i][1]));addedge(id[i][1],num,dis(s,a[i][1]));low=a[i][0];high=a[i][1];flag=1;continue;}t1=a[i][0];t2=a[i][1];if ( dblcmp(det(s,low,t1))<=0 && dblcmp(det(s,high,t1))>=0 ){addedge(num,id[i][0],dis(s,a[i][0]));addedge(id[i][0],num,dis(s,a[i][0]));}if ( dblcmp(det(s,low,t2))<=0 && dblcmp(det(s,high,t2))>=0 ){addedge(num,id[i][1],dis(s,a[i][1]));addedge(id[i][1],num,dis(s,a[i][1]));}if (id[i][0]!=idS && id[i][0]!=idT){if ( dblcmp( det(s,low,t2) ) == 1 ) break;if ( dblcmp( det(s,high,t1)) == -1 ) break;if ( dblcmp( det(s,low,t1) ) == -1 ) low=t1;if ( dblcmp( det(s,high,t2))== 1 ) high=t2;}}}int head,tail,queue[7*2*maxN+100];
bool vis[2*maxN+100];
double f[2*maxN+100];
inline double SPFA(){int S=idS,T=idT;for(int i=1;i<=cnt;i++) f[i]=INF;queue[head=tail=0]=S;f[S]=0.0;vis[S]=1;while(head<=tail){int u=queue[(head++)%(7*2*maxN+100)],v,i;double dis;vis[u]=0;for(i=info[u],v=edge[i].v,dis=edge[i].dis;i!=-1;i=edge[i].next,v=edge[i].v,dis=edge[i].dis)if ( dblcmp(dis+f[u]-f[v])==-1 ){f[v]=dis+f[u];if (!vis[v]){vis[v]=1;queue[(++tail)%(7*2*maxN+100)]=v;if ( dblcmp(f[queue[head%(7*2*maxN+100)]]-f[queue[tail%(7*2*maxN+100)]])==1 ) swap(queue[tail%(7*2*maxN+100)],queue[head%(7*2*maxN+100)]);}}}return abs(f[T]);}int main(){freopen("car.in","r",stdin);freopen("car.out","w",stdout);scanf("%d\n",&N);for(int i=1;i<=N;i++)scanf("%lf%lf%lf%lf\n",&square[i][0].x,&square[i][0].y,&square[i][1].x,&square[i][1].y);scanf("%lf%lf\n",&S.x,&S.y);for(int i=1;i<=N;i++)if (dblcmp(square[i][0].x-S.x)<=0 && dblcmp(S.x-square[i][1].x)<=0 && dblcmp(square[i][0].y-S.y)<=0 && dblcmp(S.y-square[i][1].y)<=0){eS=i;break;}scanf("%lf%lf\n",&T.x,&T.y);for(int i=1;i<=N;i++)if (dblcmp(square[i][0].x-T.x)<=0 && dblcmp(T.x-square[i][1].x)<=0 && dblcmp(square[i][0].y-T.y)<=0 && dblcmp(T.y-square[i][1].y)<=0){eT=i;break;}int g=N;N=0;for(int i=1;i<=g;i++){if (i==eS){N++;a[N][0].x=S.x;a[N][0].y=S.y;a[N][1].x=S.x;a[N][1].y=S.y;idS=id[N][0]=id[N][1]=++cnt;}if (i==eT){N++;a[N][0].x=T.x;a[N][0].y=T.y;a[N][1].x=T.x;a[N][1].y=T.y;idT=id[N][0]=id[N][1]=++cnt;}if (i==g) continue;N++;a[N][0].x=square[i][1].x;a[N][0].y=max(square[i][0].y,square[i+1][0].y);a[N][1].x=square[i][1].x;a[N][1].y=min(square[i][1].y,square[i+1][1].y);id[N][0]=++cnt;id[N][1]=++cnt;}memset(info,-1,sizeof(info));now=-1;for(int i=2;i<=N;i++)for(int j=0;j<2;j++)solve(a[i][j],id[i][j],i);ans=SPFA();scanf("%lf\n",&v);ans=ans/v;printf("%0.10lf\n",ans);return 0;}
View Code

 

转载于:https://www.cnblogs.com/maijing/p/4698959.html

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

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

相关文章

ftp服务器上传文件权限设置,ftp服务器 上传文件权限设置

ftp服务器 上传文件权限设置 内容精选换一换华为云对象存储服务帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用对象存储服务。云数据库RDS服务上的MySQL在使用上有一…

悼念512汶川大地震遇难同胞——一定要记住我爱你

Problem Description当抢救人员发现她的时候&#xff0c;她已经死了&#xff0c;是被垮塌下来的房子压死的&#xff0c;透过那一堆废墟的的间隙可以看到她死亡的姿势&#xff0c;双膝跪着&#xff0c;整个上身向前匍匐着&#xff0c;双手扶着地支撑着身体&#xff0c;有些象古人…

获取当前ip_教程丨WIN10系统下设置固定IP或动态IP

无论是电脑、手机或其他一切电子设备&#xff0c;如果需要上网&#xff0c;它就必须有一个IP地址&#xff0c;然后IP地址的获取通常又分为 动态IP(自动获取)或 静态IP(手动设置)两种模式(您所在的网络具体适用哪种模式&#xff0c;请咨询您的网络管理员&#xff1b;目前学校都是…

php实现服务器文件同步,PHPstorm配置同步服务器文件

1、配置服务器一、链接配置服务器打开菜单栏 Tools -> Deployment -> Configurationapp点击 选择 SFTP&#xff0c;并填写相关服务器信息&#xff1a;测试Type&#xff1a;链接类型&#xff0c;这里选择SFTP3dHost&#xff1a;服务器ip地址ormPort&#xff1a;端口&…

oc 实例变量可见度、方法

为什么80%的码农都做不了架构师&#xff1f;>>> ⼀、实例变量可⻅度 public 在类的外部和内部均可访问 protected(默认) 只能在该类和其⼦类内访问 private 只能在该类内访问 ⼆、⽅法&#xff08;定义、声明、调用&#xff…

使用 js替换网页中的关键词为链接

要求把一段html脚本中的疾病名添加到疾病库的链接&#xff0c;只添加一次&#xff0c;要避开超链接或图片链接。 最初是用的 str.replace(糖尿病, <a href...>糖尿病</a>); 结果找了半天&#xff0c;愣是没找到替换后的效果&#xff0c;原来是有个图片的title中…

凡人修仙传显示无法连接服务器,《凡人修仙传》网络异常及橙色BOSS补偿说明...

【网络异常及橙色BOSS补偿说明】亲爱的玩家朋友&#xff1a;《凡人修仙传》所有服务器由于网络异常在今晚(12月6日晚)陆续出现了延迟与宕机。对广大玩家造成了影响&#xff0c;我们深表歉意&#xff01;网络异常还对部分大区的橙色BOSS造成了影响&#xff0c;导致活动没有顺利进…

白屏优化_今日头条品质优化 图文详情页秒开实践

背景作为一个内容类应用&#xff0c;看新闻读资讯一直是头条用户的核心需求&#xff0c;页面的打开速度直接关系到用户使用头条的核心体验&#xff0c;在头条中&#xff0c;为了更多的承载足够丰富的样式和逻辑下保持多端体验的统一&#xff0c;详情页的内容我们是通过 WebView…

JPA字段长度 Mysql数据库

2019独角兽企业重金招聘Python工程师标准>>> 今天有个表字段超长了&#xff0c;默认是255&#xff0c;当时随手把表结构改成3600。然后晚上回来研究JPA控制的字段长度。 实验一&#xff1a; Column(length50, nullabletrue) private String valueText; 毫无疑问&…

JavaWeb学习----Cookie实现记住密码的功能

【声明】 欢迎转载&#xff0c;但请保留文章原始出处→_→ 生命壹号&#xff1a;http://www.cnblogs.com/smyhvae/ 文章来源&#xff1a;http://www.cnblogs.com/smyhvae/p/4096807.html 【正文】 本文主要内容&#xff1a; •1、什么是Cookie •2、Cookie带来的好处 •3、Co…

【学习笔记】在storyboard中给TabViewController添加tab页面

正题&#xff1a;1、首页动态拖一个UIViewController到storyboard中2、然后右键UITabBarController在木manaul栏右侧的加号连线新的UITabViewController就成功添加完毕转载于:https://blog.51cto.com/3048821/1682420

使用matlab画半透明椭圆

先上最终效果图&#xff1a; 本来是想直接用scatter和alpha来画的&#xff0c;结果在尝试以下代码后&#xff0c;发现无法显示透明效果 scatter(rand(1000,1),rand(1000,1), filled); alpha(0.5) 具体原因可以参考stackoverflow&#xff08;http://stackoverflow.com/questions…

双y轴如何合并图例_如何对图表批量组合、对齐、画中画、合并图例、自动化加标签。。。...

关于图表的组合排版&#xff0c;在之前的微信文章中介绍过很多常规的方法&#xff0c;比如《绘制复杂组合图表的独家秘笈分享》、《如何用Graphpad Prism绘制超复杂组合图&#xff1f;》、《如何用Origin完成图表排版&#xff1f;》等。可是&#xff0c;有小伙伴就问了&#xf…

小米5s的位置服务器,小米手机NFC在哪里?告诉你小米手机NFC位置(包括小米5/5s/6/MIX2/Note3)...

NFC功能的普及为智能手机锦上添花&#xff0c;闪付、充值交通卡、模拟门卡、模拟交通卡...NFC的功能越来越强大了&#xff0c;日常生活中需要用到的地方也越来越多了。可问题往往会在这个时候被发现&#xff0c;许多人在使用NFC的时候总是失败。比如说充值交通卡吧&#xff0c;…

微信转发的文件服务器留存吗,微信转发这种视频会感染病毒泄露隐私?网警的查证结果来了...

原标题&#xff1a;微信转发这种视频会感染病毒泄露隐私&#xff1f;网警的查证结果来了最近网上流传一条“紧急通知”&#xff0c;称微信上流传着一些必须转发后才能继续观看的视频&#xff0c;这些视频其实被内植病毒&#xff0c;一旦转发&#xff0c;机主隐私立马被泄露。真…

微软Connect教程系列--自动生成增删改查页面工具介绍(二)

本章课程描述了vs2015的三个特点&#xff0c;其中主要将描述在vs2015下面&#xff0c;使用命令自动生成增删改查界面&#xff0c;具体如下&#xff1a; 1、web.config文件不在存在&#xff0c;用config.json替代&#xff0c;以适应支撑vs的插件化。 即config.json可以在项目中不…

PI数据库的使用-PI System Management Tools

1、PI连接管理器 2、标记搜索 3、当前值 转载于:https://www.cnblogs.com/jumahe/p/4107790.html

一种用css实现图片在父框中等比缩放并垂直居中的办法

一个网页中往往会有很多图片&#xff0c;而网站的编辑上传图片时可能并不一定按照为父框设定的那个宽高来传&#xff0c;这样图片往往会将父框撑开或者被父框截断。一种比较好的解决的办法是这样的&#xff1a; HTML代码结构&#xff1a; <div class"dimg"><…

CLR VIA

标题 状态 内容 什么是CLR? 什么是托管模块&#xff1f; 托管模块由什么组成&#xff1f; 。net代码的执行过程 http://www.cnblogs.com/aaa6818162/p/4726581.html http://www.cnblogs.com/kingmoon/archive/2012/07/16/2594459.html 为了执行程序&#xff0c;首…

jQuery表格排序总成-tablesorter

一个、进口单证<script type"text/javascript" src"js/jquery.js"></script> <script type"text/javascript" src"js/jquery.tablesorter.js"></script> <!-- 引入下面样式则表头出现排序图标。同一时候…