dijkstra求次短路径
发布日期:2021-06-29 05:37:44 浏览次数:2 分类:技术文章

本文共 2523 字,大约阅读时间需要 8 分钟。

之前用Dijkstra算法求过最短路径,求次短路径在之前的方法上做一下修改就可以。

求从s到t的次短路径有两种情况:1、起点s到某个顶点u的最短路+d(u,t)。2、起点到某个顶点u的次短路+d(u,t)。

所以更新路径的时候需要把最短路径和次短路径两个都记录下来。

具体见代码:

#define N 100000+10  #define INF 100000000  typedef pair
P; int n,r; struct Edge{ int to, cost; }; vector
G[N]; int dist[N], dist2[N]; void addedge(int u, int v,int w) { G[u].push_back(Edge{ v, w }); G[v].push_back(Edge{ u, w }); } void solve() { priority_queue
, greater

>q; fill(dist, dist + n, INF); fill(dist2, dist2 + n, INF); dist[0] = 0; q.push(P(0, 0)); while (!q.empty()) { P u = q.top(); q.pop(); int v = u.second, d = u.first; if (dist2[v] < d)continue;//取出的不是最短路径,也不是次短距离,抛弃 for (int i = 0; i < G[v].size(); i++) { Edge&e = G[v][i]; int d2 = d + e.cost; if (dist[e.to]>d2)//更新最短距离 { swap(dist[e.to], d2); q.push(P(dist[e.to], e.to)); } if (dist2[e.to]>d2&&dist[e.to] < d2)//更新次短距离 { dist2[e.to] = d2; q.push(P(dist2[e.to], e.to)); } } } printf("%d\n", dist2[n - 1]); }

参考自:http://blog.csdn.net/u014800748/article/details/44923679

习题:POJ3225

题意:就是求两个点之间的次短路径(如果最短路径有好多条,那么次短路径是比这些最短路径都长,但比其他路径都短的那条)

代码:

#include 
#include
#include
#include
#include
#include
using namespace std;#define N 5005#define INF 111111111struct Edge{ int to ,w; bool operator <(const Edge &a)const{ return w > a.w; }};priority_queue
Q;vector
V[N];int n, m;int dis[N], dis2[N];void init(){ for(int i = 1; i <= n; i++){ V[i].clear(); dis[i] = INF; dis2[i] = INF; }}int dijkstra(){ dis[1] = 0; Edge p, q, r; p.to = 1, p.w = 0; Q.push(p); while(!Q.empty()){ p = Q.top(); Q.pop(); int u = p.to; if(p.w > dis2[u])continue; for(int i = 0; i < V[u].size(); i++){ q = V[u][i]; int to = q.to, d = q.w + p.w; if(dis[to] > d){ swap(dis[to], d); r.to = to, r.w = dis[to]; Q.push(r); } if(dis[to] < d && dis2[to] > d){ dis2[to] = d; r.to = to, r.w = d; Q.push(r); } } } return dis2[n];}int main(){ int a, b, w; Edge p; while(cin>>n>>m){ init(); for(int i = 0; i < m; i++){ scanf("%d%d%d", &a, &b, &w); p.to = b; p.w = w; V[a].push_back(p); p.to = a; V[b].push_back(p); } int len = dijkstra(); cout<
<
其中一组不错的数据:

4 61 2 11 2 51 3 22 3 22 4 12 4 6ans:4
本数据的次短路径为:1->2->1->2->4

(存在重复走的路径)

转载地址:https://blog.csdn.net/zhj_fly/article/details/75506896 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:欧几里德与拓展欧几里德定理
下一篇:指针数组和数组指针

发表评论

最新留言

很好
[***.229.124.182]2024年04月20日 02时46分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Atiitt uke兼wag集团2017年度成果报告总结 attilax著 1. 组织机构进一步完善 8大首席部门 1 2. 事业部进一步完善,以及一百多个事业部了 1 3. 企业文化进一步完善 1 2019-04-29
Atititi ui之道 attilax著 v3 s11.docx 1. 概览 2 1.1. 软件设计可分为两个部分:编码设计与UI设计 2 2. 用户界面设计的三大原则是:置界面于用户的控制之下; 2019-04-29
Atitit 集团与个人的完整入口列表 attilax的完整入口 1. 集团与个人的完整入口列表 1 2. 流量入口概念 2 3. 流量入口的历史与发展 2 1.集团与个人的完整入口列表 2019-04-29
Atitit 网络编程之道 2019-04-29
Atiitt attilax掌握的前后技术放在简历里面.docx 2019-04-29
Atiitt 文档处理之道 attilax著 2019-04-29
Atiitt 可视化 报表 图表之道 attilax著 Atitit.可视化与报表原理与概论 1. 信息可视化 1 2. Gui可视化 2 2.1. atitit 知识的可视化.docx 2 2019-04-29
paip.c#图片裁剪 2019-04-29
paip.html 及css调试工具---debugbar 2019-04-29
paip.项目开发效率提升之思索 2019-04-29
paip.项目开发效率提升之思索 2019-04-29
Atitit spring5 集成 mybatis 注解班 2019-04-29
Atitit springboot mybatis spring 集成 Springboot1.4 mybatis3.4.6 /springbootMybatis 目录 1.1. 设置map 2019-04-29
Atitit 模板引擎总结 目录 1. 模板引擎 1 2. 常见模板步骤 1 2.1. 1)定义模板字符串 1 2.2. 2)预编译模板 2 2.3. 渲染模板 2 3. 流程渲染 if el 2019-04-29
Atitit 字符串转换数组main参数解析 args splitByWholeSeparator String string=" -host 101.1 8*124 -db 1 2019-04-29
paip.提升效率----几款任务栏软件vc59 2019-04-29
paip.验证码识别---序列号的反转 2019-04-29
paip.php调试脱离IDE VC59 2019-04-29
paip.DEVSUIT WEB .NET ASPX网站打开慢的原因 2019-04-29
央行数字货币将取代纸币?这篇文章说明白了 2019-04-29