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

NOI2011 智能车比赛相关推荐

  1. RT-Thread与智能车比赛

      在第十六届全国大学生智能汽车竞赛中引入了多种MCU类型应用于不同的赛题组,包括有Infineon, STC, WCH, MindMotion,NXP等.在智能车控制系统开发过程中中引入实时嵌入式操 ...

  2. 听说你是参加智能车比赛的?

    问:我想问问,你们参加智能车竞赛同学都是学什么专业的? 答:什么专业都有,但基本上都和"自动化"有关系. 像什么电气自动化.机械自动化.化工自动化.仪器仪表自动化.设计自动化.说白 ...

  3. 【资料分享】智能车比赛 - 硬件调教

    资料作用 我是参加了第十五届全国大学生智能车比赛的选手,这里指的智能车比赛,名字我现在也说不准确,恩智浦.飞思卡尔.英飞凌等待赞助商,比赛项目是分组别的,四轮组.双车组等等,如果你一开始看到这里,明白 ...

  4. 第七届飞思卡尔智能车比赛的赛道边缘提取-----第一篇博客

    园龄有11个月了??.这么快...因为参加飞思卡尔的智能车比赛,所以申请开通了这个博客,想不到这么容易就通过了. 看过这么多博客了,感觉写博客都是 在各种方面很有实力的人,包括软件,硬件. 但,永远不 ...

  5. 第16届百度智能车比赛-方案制定与选择(技术报告)

    题记:这是一场因为规则审慎问题,导致取消成绩的失败方案,但并不是完全没有一些参考的意义和价值.以车会友,一直是智能车比赛的初衷,也是我们一直奋斗的目标.这个方案稳定度高,并且获得(470,500)的还 ...

  6. 独立、原创、总结、分享、行动——由海滨学生參观实验室及“飞思卡尔”杯智能车比赛想到的...

    题记:下面内容,都是老师在和学生交流过程中发现的现象,这里主要指出了存在的问题和可能的解决方法.事实上同学们也有非常多的长处.这里没有一一叙述.本着"有则改之,无则加勉"的态度分享 ...

  7. 独立、原创、总结、分享、行动——由海滨学生参观实验室及“飞思卡尔”杯智能车比赛想到的

    题记:以下内容,都是老师在和学生交流过程中发现的现象,这里主要指出了存在的问题和可能的解决方法.其实同学们也有很多的优点,这里没有一一叙述.本着"有则改之,无则加勉"的态度分享自己 ...

  8. “大一新生如何参加智能车比赛”帖子回复

      在论坛水了两三年了,见到了不少大佬非常厉害的开源设计,也算是这个论坛( ZNCZZ )的忠实受益者之一.   这篇帖子是搬运我在知乎一个问题,"大一新生如何参加智能车比赛"下面 ...

  9. 第八届CUIT电磁智能车比赛参赛学习总结 Part1:工字电感+LMV358型电磁杆

    部分资料和图示来源网络,如有侵权请联系删稿 Part1:认识电感 工字电感的组成:工字电感线圈一般由工字形磁芯骨架跟漆包铜线及一些辅料组成的电磁感应元件,它主要是在工字骨架的槽内绕上线圈,线圈的二个头 ...

最新文章

  1. 深度学习已经彻底改变了制造业的质量控制,但还不够深入
  2. Microsoft Visual Studio 2005 简体中文专业版(DVD)下载地址
  3. 国内外开源与 SaaS ,团队协作平台、项目管理工具整理
  4. SSH(Struts2+Hibernate+Spring)开发策略
  5. AOP—JVM SandBox—快速上手
  6. premiere安装失败解决办法
  7. 使用AIDL实现进程间的通信
  8. 机器学习基础(五十)—— Gini Impurity(基尼不纯度)与香浓熵(Shannon Entropy))
  9. Qt QScrollArea and layout in code
  10. 分布式图数据库-JanusGraph简介
  11. Redis(二)Redis客户端的使用
  12. JavaScript的加密混淆技术
  13. [免费配音软件]配音助手1.0 阿里云配音软件
  14. 关于STM32H7的串口DMA的使用
  15. 对于无人驾驶技术(驾驶自动化)L0-L5分级的说明
  16. 电影/电视剧/综艺/动漫/游戏 下载链接搜索引擎
  17. 【转】统一μITRON,日本成立开放源码ITRON团体
  18. USB3.0:VL817Q7-C0的LAYOUT指南(二)
  19. 拓扑结构计算机网络结构,计算机网络的常见的七种拓扑结构
  20. 从软件角度看央视“赢在中国”节目的那套投票系统

热门文章

  1. leetcode739 每日温度
  2. 尚硅谷李老师笔记3DQL
  3. 算法(13)-leetcode-explore-learn-数据结构-链表小结
  4. 大数据学习(2-2)- 使用docker安装配置Hadoop环境
  5. 关于计算机展览的英语作文,2015考研英语作文范文精选:选什么东西参加展览?...
  6. 钱荒下银行理财收益率角逐:邮储银行垫底
  7. 程序员的半衰期只有15年?
  8. 苹果产品开发的绝密工作流程
  9. MPEG(mpeg1,mpeg2,mpeg4) 与H264 QP值间 关系
  10. 用线性插值算法实现图像缩放