问题描述

蒜头君陷入了坐标系上的一个迷阵,迷阵上有 n 个点,编号从 1 到 n。蒜头君在编号为 1 的位置,他想到编号为 n 的位置上。蒜头君当然想尽快到达目的地,但是他觉得最短的路径可能有风险,所以他会选择第二短的路径。现在蒜头君知道了 n 个点的坐标,以及哪些点之间是相连的,他想知道第二短的路径长度是多少。
注意,每条路径上不能重复经过同一个点。
输入格式
第一行输入两个整数 n (1≤n≤200) 和 m,表示一共有 n 个点和 m 条边。
接下来输入 n 行,每行输入两个整数xi,yi(−500≤xi,yi≤500),代表第 ii 个点的坐标。
接下来输入 mm 行,每行输入两个整数 pj,qj(1≤pj,qj≤n),表示点pj和点 qj之间相连。
输出格式
输出一行,输出包含一个数,表示第二短的路径长度(小数点后面保留两位),如果第一短路径有多条,则答案就是第一最短路径的长度;如果第二最短路径不存在,则输出 −1。
样例输入
3 3
1 1
2 2
3 2
1 2
2 3
1 3
样例输出
2.41

思路

先求出最短路,然后在依次删除这条最短路上的点及相连的边,每删一求次出此时的最短路即为次短路,取所有次短路中最小值即为此图的次短路,提示:对最短路为起点到终点仅有一条有向边的情况需要特殊处理

#include<bits/stdc++.h>
#include<cstring>
using namespace std;const int N = 205;vector<int> v_pos[N];double g[N][N];double dis[N];bool vis[N];int n, m;int pre[N];  //用一个数组记录当前点是由哪个点更新的,例如pre[2] = 1 ,即结点2由1更新得到void Dijkstra(int u,int dele_v){memset(dis,0x7f,sizeof dis);dis[u] = 0;pre[1] = 1;  //结点1由自身得到的for(int i = 0 ;i < n; ++i){double min_d = dis[0];int min_v = -1;for(int j = 1; j <= n; ++j){if(j != dele_v && !vis[j] && dis[j] < min_d){min_d = dis[j];min_v = j;}}if(min_v == -1){  //说明单源最短路已经找齐return;}vis[min_v] = true;  //标记for(int k = 1; k <= n; ++k){  //遍历和j相邻的点if(k != dele_v && min_v != k && !vis[k] && dis[k] > min_d + g[min_v][k]){dis[k] = min_d + g[min_v][k];pre[k] = min_v;}}}
}int main(){memset(g,0x7f,sizeof g);cin >> n >> m;int i = 1;int  t = n;while(t--){int x,y;cin >> x >> y;v_pos[i].push_back(x);v_pos[i].push_back(y);++i;}while(m--){int u,v;cin >> u >> v;double len = sqrt((v_pos[u][0]-v_pos[v][0])*(v_pos[u][0]-v_pos[v][0])+(v_pos[u][1]-v_pos[v][1])*(v_pos[u][1]-v_pos[v][1]));g[u][v] = g[v][u] = len;}Dijkstra(1,0);double ans = g[0][0];if(pre[n] == 1){     //如果刚好从1到n最短路前一个结点就是1,即最短路就是1和n的边权,需要特殊处理g[1][n] = g[n][1] = g[0][0];  //删除从1到n的无向边memset(vis,0,sizeof vis);    //注意!!!! 每用一次Dijkstra,就得重置一次visDijkstra(1,0);ans = min(ans,dis[n]);}else{              //否则,依次删去最短路除头尾结点的各个结点,再进行Dijkstra算法,找出删去结点的最短路的最小值,即次短路for(int p = pre[n]; p != 1; p = pre[p]){memset(vis,0,sizeof vis);    //注意!!!! 每用一次Dijkstra,就得重置一次visDijkstra(1,p);    //对最短路上有其他点的情况,只需依次删除点即可ans = min(dis[n], ans);}}printf("%.2f\n",ans);return 0;
}

迷阵突围——Dijkstra求次短路相关推荐

  1. 迷阵突围 (dijkstra求次短路)邻接表,邻接矩阵

    分析:dijkstra算法求最短路问题.先求最短路,再依次删除最短路上的边,每次删除一条,使用dijkstra求此时的最短路,更新最小值,最后得到第二短路.f标记删除与否,抑或便于寻找无向图的两条边. ...

  2. ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)

    模板 时间复杂是 O(n2+m), n表示点数,m 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存 ...

  3. 图论入门(一),拓扑排序生成拓扑序列与Dijkstra求最短路

    基本知识 Dijkstra基本思想 拓扑排序思维视频讲解 848:有向图的拓扑排序 题目链接 题解: #include<bits/stdc++.h> using namespace std ...

  4. AcWing 850. Dijkstra求最短路 II

    原题链接:AcWing 850. Dijkstra求最短路 II 给定一个 n 个点 m 条边的有向图,图中可能存在 重边 和 自环 ,所有边权均为 非负值 . 请你求出 1 号点到 n 号点的最短距 ...

  5. AcWing 850. Dijkstra求最短路 II【最短路】【堆优化版Dijkstra】

    AcWing 850. Dijkstra求最短路 II 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 850. Dijkstra求 ...

  6. 堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II

    堆优化版dijkstra算法分析: 朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程. 可以用小根堆(C++STL priority_queue)对dist数 ...

  7. Dijkstra AcWing 850. Dijkstra求最短路 II

    Dijkstra AcWing 850. Dijkstra求最短路 II 原题链接 AcWing 850. Dijkstra求最短路 II 算法标签 最短路 Dijkstra 思路 图片摘自该题解 图 ...

  8. PAT甲级1003 Emergency:[C++题解]dijkstra求最短路、最短路条数

    文章目录 题目分析 题目链接 题目分析 分析:求单源最短路,使用dijkstra()算法. 最短路的条数,和最短路中 人数最多的一条,输出最多人数. 本题点比较少,使用邻接矩阵d[N][N]来存. a ...

  9. Dijkstra求最短路 II

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...

最新文章

  1. 玩转智能路由器-WRTnode开发板[接上网线]
  2. LVS+Keepalived 高可用群集的介绍和搭建步骤
  3. spark中的println失效问题解决
  4. 介绍Spring Integration
  5. [C指针] 用图表解读C声明:Unscrambling C Declarations by Diagram
  6. flink基本原理入门
  7. React 事件处理函数
  8. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_10_练习:集合元素处理(传统方式)...
  9. binder机制原理android,Binder机制1---Binder原理介绍
  10. 20个你需要知道的JavaScript简写代码片段
  11. 计算机职业适应性测试题库,职业适应性测试题库 一、性格职业适应度测试.doc...
  12. 赤壁之战(dp树状数组)
  13. 使用EasyExcel下载,文件名乱码问题处理
  14. Java用数组实现队列和循环队列
  15. 一般英文(java)
  16. JZ 20 表示数值的字符串:抽象与逻辑练习
  17. cdma特有效应_CDMA原理部分考试题(含答案).doc
  18. 5G通信芯片发展与零售新机遇
  19. 蓝桥杯单片机第十三届第二场
  20. CAD延伸功能如何使用?CAD延伸应用实例

热门文章

  1. pythoncookie自动登录_Python爬虫连载6-cookie深入使用实例化实现自动登录
  2. K8S 生态周报| Helm v3.4 发布
  3. JMeter 进行压力测试
  4. 干货 | 对象存储的跨地域复制概述
  5. STM32F0xx_TIM输入捕获(计算频率)配置详细过程
  6. 如何判断轨道上行下行
  7. 万字长文 | 2023届校招算法岗知识总结
  8. 算法训练 逗志芃的危机
  9. sonarQube扫描代码生成pdf
  10. 下一个创业风口 大脑银行商学堂助力中小企业从直播中寻求创业新机遇