// 路径还原
// 求最短路,并输出最短路径
// 在单源最短路问题中我们很容易想到,既然有许多条最短路径,那将之都存储下来即可
// 但再想一下,我们是否要把所有的最短路径都求出来呢?
// 实际上不需要,这里我们用一个数组来记录最短路径,之后的最短路径都是在之前最短路径上的延申
// 所以只需要一个数组,存储前一个节点即可 // 这里我们用邻接表和优先级队列来实现复杂度为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. makefile自动依赖生成

    自动依赖生成 基于make的构建环境要正确工作, 一个很重要(也很烦人)的任务是, 在makefile中正确列 举依赖. 这个文档将介绍了一个非常有用的让make自身来创建和维护这些依赖的方法. 文章 ...

  2. python多层数组合成一个数组后循环打印出数组内的每一项元素的方法

    a=[1,2,3,4] b=[5,6,7,8] c=[a,b] def test(c): for i in c: return i print(test(c)) 以上代码执行后打印出来的结果是 预期目 ...

  3. 《Netlogo多主体建模入门》笔记 2

    从自带的模型库开始     财富分配模型 黄色代表稻谷,有的人消化快,有的慢,稻谷的积累代表财富的积累,不涉及交易行为.   点击setup后 ,点击 go   红线--穷人: 绿线-- 中产 : 蓝 ...

  4. python之pymysql模块

    模块安装 pip install pymysql 执行sql语句 import pymysql #通过pymysql下的connect函数来建立一个传输通道,连接本地mysql的所以host地址是12 ...

  5. c/python 的区别

    c             python                                                                                ...

  6. Warshall算法求传递闭包及具体实现

    传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y ...

  7. Maven的scope属性作用域范围

    在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值: 1. compile,缺省值,适用于所有 ...

  8. Jenkins | 搭建你第一个Jenkins应用

    搭建你第一个Jenkins应用 1.准备工作 第一次使用 Jenkins,您需要: 机器要求: 256 MB 内存,建议大于 512 MB 10 GB 的硬盘空间(用于 Jenkins 和 Docke ...

  9. 乌班图14更新软件提示错误:https://mirrors.aliyun.com kubernetes-xenial InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 6A030B21BA07F4FB

    提示如下 获取: https://mirrors.aliyun.com kubernetes-xenial InRelease 忽略 https://mirrors.aliyun.com kubern ...

  10. springboot结合Docker部署

    工程目录 创建Dockerfile FROM java VOLUME /tmp ADD springboot-docker-0.0.1-SNAPSHOT.jar app.jar RUN bash -c ...