// 路径还原
// 求最短路,并输出最短路径
// 在单源最短路问题中我们很容易想到,既然有许多条最短路径,那将之都存储下来即可
// 但再想一下,我们是否要把所有的最短路径都求出来呢?
// 实际上不需要,这里我们用一个数组来记录最短路径,之后的最短路径都是在之前最短路径上的延申
// 所以只需要一个数组,存储前一个节点即可 // 这里我们用邻接表和优先级队列来实现复杂度为o( E*log(N) )的Dijkstra算法 #include <cstdio>
#include <iostream>
#include <queue>
#include <vector> using namespace std; const int max_N = +;
const int max_E = +;
const int INF = 1e9; int N,E,S;
int d[max_N];
int pre[max_N]; struct edge
{
int to,cost;
};
edge es[max_N]; vector<edge> G[max_N]; typedef pair<int,int> P; void Dijkstra(int s)
{
pre[s]=-;
fill(d,d+N,INF);
d[s]=;
// 实现最小堆
priority_queue< P,vector<P>,greater<P> > que;
que.push(P(,s)); while(!que.empty())
{
// 非空时,取出一个顶点
P p=que.top();
que.pop();
// 当前节点的编号是v,队列中记录的到当前节点的最短距离是p.first
int v=p.second;
// 如果当前节点的最小值,小于数组中记录的最小值的话
// 说明当前节点的最小值已经被覆盖过了,这个节点是无效节点,继续下一次循环
if(d[v]<p.first)
{
continue;
} for(int i=;i<G[v].size();++i)
{
edge e=G[v][i]; if(d[e.to]>d[v] + e.cost)
{
d[e.to]=d[v]+e.cost;
pre[e.to]=v;
que.push(P( d[e.to],e.to ));
}
} } } void path(int i)
{
if(i==S)
{
printf("start:%d\n",S);
return;
}
vector<int> p;
for(;i!=-;i=pre[i])
{
p.push_back(i);
}
vector<int>::iterator it;
for(it=p.end()-;it!=p.begin()-;--it)
{
cout<<*it<<' ';
}
cout<<endl;
} int main()
{
scanf("%d %d",&N,&E);
int a,b,c;
for(int i=;i<E;++i)
{
scanf("%d %d %d",&a,&b,&c);
edge e;
e.to=b;
e.cost=c;
G[a].push_back(e);
// 无向图
e.to=a;
e.cost=c;
G[b].push_back(e);
}
// 起点为0号节点
S=; Dijkstra(S); for(int i=;i<N;++i)
{
printf("%d ",d[i]);
} printf("\n\n"); for(int i=;i<N;++i)
{
path(i);
} return ;
} /*
7 10
0 1 2
0 2 5
1 2 4
1 3 6
1 4 10
2 3 2
3 5 1
4 5 3
4 6 5
5 6 9 */

最短路问题 Dijkstra算法- 路径还原的更多相关文章

  1. 最短路问题---Dijkstra算法学习

    Dijkstra又称单源最短路算法,就从一个节点到其他各点的最短路,解决的是有向图的最短路问题 此算法的特点是:从起始点为中心点向外层层扩展,直到扩展到中终点为止. 该算法的条件是所给图的所有边的权值 ...

  2. 最短路问题Dijkstra算法

    Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...

  3. 单源最短路问题 Dijkstra 算法(朴素+堆)

    选择某一个点开始,每次去找这个点的最短边,然后再从这个开始不断迭代,更新距离. 代码: 朴素(vector存图) #include <iostream> #include <cstd ...

  4. HDU_1874——最短路问题,Dijkstra算法模版

    Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行 ...

  5. 【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现

    Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...

  6. 最短路问题之Dijkstra算法

    题目: 在上一篇博客的基础上,这是另一种方法求最短路径的问题. Dijkstra(迪杰斯特拉)算法:找到最短距离已经确定的点,从它出发更新相邻顶点的最短距离.此后不再关心前面已经确定的“最短距离已经确 ...

  7. dijkstra算法解决单源最短路问题

    简介 最近这段时间刚好做了最短路问题的算法报告,因此对dijkstra算法也有了更深的理解,下面和大家分享一下我的学习过程. 前言 呃呃呃,听起来也没那么难,其实,真的没那么难,只要弄清楚思路就很容易 ...

  8. 基于dijkstra算法求地铁站最短路径以及打印出所有的路径

    拓展dijkstra算法,实现利用vector存储多条路径: #include <iostream> #include <vector> #include <stack& ...

  9. HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题

    参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上:  迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...

随机推荐

  1. c#数字图像处理(六)直方图均衡化

    直方图均衡化又称直方图修平,是一种很重要的非线性点运算.使用该方法可以加强图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好的在直方图上分布. 直方图均衡化的基 ...

  2. 面试系列-面试官:你能给我解释一下javascript中的this吗?

    一.前言 关于javascript中的this对象,可能已经被大家说烂了. 即使是这样,我依然决定将这篇文章给水出来.毕竟全国在新型肺炎的影响下,公司没法正常复工. 除了刷刷手机,还是要适当的学习一下 ...

  3. AI初探

    看东西应该记笔记,不然如过眼云烟,如只逛商场,不买东西,不留下带走什么,就是浪费时间,没有收获,仅此开始,定期梳理看过的东西. 人工智能的目的是什么呢? 答:让机器表现得更像人类,甚至在某些技能上超越 ...

  4. Centos7搭建FastFDS----分布式文件服务系统服务端

    一.FastDFS介绍 FastDFS开源地址:https://github.com/happyfish100 参考:分布式文件系统FastDFS设计原理 参考:FastDFS分布式文件系统 1.1简 ...

  5. vue响应式原理的实现

    响应式实现的原理---如何监控数据的变化:两种方法 Vue 2.x defineProperty(es5) Vue 3.x Proxy(es6) 语法:Object.defineProperty(参数 ...

  6. Exception | java.security.NoSuchProviderException: no such provider: BC

    背景 今天在用PGP key做JWT签名和验签的时候,转换报了如下错误: org.bouncycastle.openpgp.PGPException: exception on setup: java ...

  7. C++ 自动类型推断

    C++语言提供了自动类型推断的机制,用于简化代码书写,这是一种很不错的特性,使用auto和decltype都可以完成自动类型推断的工作,而且都工作在编译期,这表示在运行时不会有任何的性能损耗. 一.a ...

  8. python 爬虫过程中出现:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接

    参考: https://blog.csdn.net/illegalname/article/details/77164521

  9. HotSpot虚拟机对象创建

    2.3.1对象创建 Java是一门面向对象的语言,在Java程序的运行过程中无时无刻都有新的对象被创建出来.从语言的层面看,创建对象通常仅仅是一个new关键字而已,从虚拟机的角度看,创建对象又是怎样的 ...

  10. [xml]AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getroot'

    >>> import requests >>> res = requests.get("https://xxx.com/sitemap.xml" ...