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

    声明:文章主要是总结手游开发的经验,只涉及到了前向渲染.未涉及延迟渲染. Unity的Surface Shader本质上就是VS/PS.只不过Unity经过精心设计,将shader划分为了几个关键部分 ...

  2. Apache Hudi 0.5.1版本重磅发布

    历经大约3个月时间,Apache Hudi 社区终于发布了0.5.1版本,这是Apache Hudi发布的第二个Apache版本,该版本中一些关键点如下 版本升级 将Spark版本从2.1.0升级到2 ...

  3. Java程序员学习Go指南(二)

    摘抄:https://www.luozhiyun.com/archives/211 Go中的结构体 构建结构体 如下: type AnimalCategory struct { kingdom str ...

  4. Visual studio 2015 与 mysql 连接

    Visual Studio 2015 Community连接到MySQL,步骤很简单,但刚弄的时候一脸. 这个学期开了一门课程,老师教的是visual studio 2010来开发.net的,但是我自 ...

  5. freemark 基本使用

    实际上用程序语言编写的程序就是模板. FTL (代表FreeMarker模板语言). 这是为编写模板设计的非常简单的编程语言. 模板(FTL编程)是由如下部分混合而成的: 文本:文本会照着原样来输出. ...

  6. 一次DB故障引起的反思和MySQL Operator选型

    前言 在一次数据库故障后,我们发现业务库会根据业务的等级会划分多个 MySQL 实例,许多业务库会同时属于一个 MySQL 实例,当一个库引发问题后整个实例的状态是不可控的.从而导致这个实例上的所有业 ...

  7. python随机生成字符

    Python2: Unicode是一种通用的编码方式,不论是英文字母.汉字.日语还是其他文字都能够对应一个唯一的Unicode编码(序号). chr(100) # 得到整数对应的ascii码(小于25 ...

  8. java架构之路-(netty专题)netty的编解码(出入战)与粘包拆包

    上次回归: 上次博客我们主要说了netty的基本使用,都是一些固定的模式去写的,我们只需要关注我们的拦截器怎么去写就可以了,然后我们用我们的基础示例,改造了一个简单的聊天室程序,可以看到内部加了一个S ...

  9. Tomcat安装教程及常见错误解决方法

    目录 Tomcat安装教程及常见错误解决方法 一.安装前准备 ·熟悉自己电脑的操作系统版本(32位or64位) ·保证电脑上已经装好JDK,并且已经设置好环境变量. 二.Tomcat安装教程(以Tom ...

  10. k8s系列---ingress资源和ingress-controller

    https://www.cnblogs.com/zhangeamon/p/7007076.html http://blog.itpub.net/28916011/viewspace-2214747/ ...