思路:直接建图,走一遍迪杰斯特拉,最后比较一下能到达边界点的最短路径就可以了。正确性还没具体验证,不过样例过了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#define inf 0x3f3f3f3f
#define debug cout<<"debug"<<endl
using namespace std;
const int maxn=1e4+50;
vector<int> g[maxn];
vector<int> ok_node;
int n,d,diss[maxn],p[maxn],ans,ans_node;
bool vis[maxn];struct Node{int x,y;Node(int xx,int yy):x(xx),y(yy){}Node(){}
}node[maxn];struct HeapNode{int d,u;bool operator < (const HeapNode& rhs) const{return d>rhs.d;}
};struct Edge{int from,to,dis;Edge(int ff,int tt,int dd):from(ff),to(tt),dis(dd){}
};vector<Edge> edge;double ok_dis(Node a,Node b){///计算距离return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}bool ok_bound(Node a){///确定边界范围内的点if((a.x>=0&&a.x<=d&&a.y>=0&&a.y<=100)||(a.x>=d&&a.x<=100&&a.y>=100-d&&a.y<=100)||(a.x>=100-d&&a.x<=100&&a.y>=0&&a.y<=100-d)||(a.x>=d&&a.x<=100-d&&a.y>=0&&a.y<=d))return true;return false;
}void dij(){priority_queue<HeapNode> q;memset(diss,inf,sizeof(diss));diss[0]=0;memset(vis,0,sizeof(vis));q.push(HeapNode{0,0});while(!q.empty()){HeapNode temp=q.top();q.pop();int uu=temp.u;if(vis[uu]) continue;vis[uu]=true; for(int i=0;i<g[uu].size();i++){Edge &e=edge[g[uu][i]];if(diss[e.to]>diss[uu]+e.dis){diss[e.to]=diss[uu]+e.dis;p[e.to]=uu;q.push(HeapNode{diss[e.to],e.to});} }}
}int main(){while(scanf("%d",&n)!=EOF){if(n==-1) break;ans=inf;memset(node,0,sizeof(node));edge.clear(),memset(g,0,sizeof(g)),ok_node.clear();scanf("%d",&d);node[0].x=50,node[0].y=50;if(ok_bound(node[0])) ok_node.push_back(0);///ok_node存放可以到达边界的点for(int i=1;i<=n;i++){int xx,yy;scanf("%d%d",&xx,&yy);node[i].x=xx+50,node[i].y=yy+50;if(ok_bound(node[i])){ok_node.push_back(i);}}if(ok_node.empty()){printf("-1\n");continue; }for(int i=0;i<=n;i++) for(int j=i+1;j<=n;j++){double dis=ok_dis(node[i],node[j]);if(!i) dis-=7.5;if(dis<=d){edge.push_back(Edge(i,j,1));g[i].push_back(edge.size()-1);///边编号从0开始 edge.push_back(Edge(j,i,1));g[j].push_back(edge.size()-1);} }if(edge.empty()){printf("-1\n");continue; } dij();for(int i=0;i<ok_node.size();i++){int kk=ok_node[i];if(diss[kk]<ans)   ans=diss[kk],ans_node=kk;}stack<int> s;int ee=ans_node;for(;;){if(!diss[ee]) break;s.push(ee);ee=p[ee];}printf("%d\n",ans+1);///最后别忘了还要跳到边界上while(!s.empty()){int temp=s.top();s.pop();printf("%d %d\n",node[temp].x-50,node[temp].y-50);           }}return 0;
}

拯救007 迪杰斯特拉最短路解决相关推荐

  1. 数学建模算法:Dijkstra(迪杰斯特拉)算法解决你的选择困难症

    是否曾经深陷选择困难症,面对一堆选择而无从是从? 一文学会Dijkstra算法解决你的选择困难症 我们可以把问题实例化为从图中1到5,怎么走是最短路径? 一:Dijkstra算法概述. 二:Dijks ...

  2. P1462 通往奥格瑞玛的道路(二分 迪杰斯特拉 最短路 + spfa最短路算法)

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  3. 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...

  4. CF449B Jzzhu and Cities 迪杰斯特拉最短路算法

    CF449B Jzzhu and Cities 其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^) AC代码: #include<bits/stdc++.h> #d ...

  5. 最短路径之迪杰斯特拉(Dijkstra 算法)弗洛伊德算法(C语言完整代码实现)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  6. 最短路径问题(图表详解迪杰斯特拉算法)

    首先,我们来看一下相关的图的一些基本知识点: 图:图 G=(V,E) 由顶点集 V 和边集 E 组成.每条边对应一个点对 (v,w),其中 v,w 属于 V .如果图中的点对是有序的,那么该图就是有向 ...

  7. 校园导游系统_C语言实现_Dijkstra(迪杰斯特拉算法)_数据结构

    西京学院导游系统 摘要   要完成对整个导游图系统的功能实现,需要对每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现和需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确 ...

  8. java数据结构和算法——迪杰斯特拉(Dijkstra)算法

    目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...

  9. 迪杰斯特拉算法c语言6,C语言迪杰斯特拉实现最短路径算法.doc

    数据结构课程设计报告 ----旅游咨询系统设计 目录 一.需求分析- 2 - 二.系统分析- 2 - 三.概要设计- 3 - 一.系统划分- 3 - 二.邻接矩阵建立流程图:- 3 - 三.迪杰斯特拉 ...

最新文章

  1. 两个坐标系进行了缩放平移后的变换关系
  2. OpenCV移植各向异性图像分割间隙流体的实例(附完整代码)
  3. Python中List的复制(直接复制、浅拷贝、深拷贝)
  4. python3.x版本的保留字总数是多少_Python3.6.5版本的保留字总数是:()-智慧树大数据分析的python基础章节答案...
  5. MyBatis全局配置文件和映射文件
  6. 在SourceForge中建立开源项目
  7. webserver总结
  8. 64位oracle plsql developer 下载地址,plsql developer
  9. Tableau 10.5 安装教程
  10. 参考手册资源 百度云
  11. matlab利用经纬度计算距离_【MATLAB】经纬度换算距离
  12. 非线性拟合(C++版)
  13. 按键精灵获取14位纯数字当前时间,时间格式yyyyMMddHHmmss
  14. 堪培拉地理位置经纬度_澳大利亚堪培拉和悉尼及墨尔本的地理位置
  15. 【周年福利Round1】一文看破Swift枚举本质
  16. word插入分页符后在下一页开始出现一个回车符,这个回车符如何删掉,但不影响分页
  17. CIsco思科三层交换配置DHCP,客户端动态获取
  18. Python基础;个人名片制作程序
  19. 描写火车站场景_求几段描写火车站的段落,而且是描写的极好的段落
  20. vue项目对接pad端——混合开发总结

热门文章

  1. Rust actix aiohttp_【Rust架构】Rust web框架比较
  2. css3选择器如何选择同一个父级下的相同class的第一个元素 nth-child nth-of-type
  3. endnote安装教程(附安装包)
  4. 汽车左后门板大型注塑模具设计
  5. java开发愤怒的小鸟_Java实现愤怒的小鸟AngryBirds游戏源码
  6. win10 讲述人 关闭快捷键响应 ctrl win enter
  7. 绩效考核中如何填写自我评价?(上)
  8. 呼吁大家:坚决抵制KingRoot,不要下载安装该流氓软件!
  9. 【Unity笔记】使用IK来控制手持武器以及武器瞄准(一)
  10. Unity3D 实践学习1 GUI井字棋的实现