拓展dijkstra算法,实现利用vector存储多条路径:

#include <iostream>
#include <vector>
#include <stack>
using namespace std; const int maxnum = ;
const int maxint = ; // 各数组都从下标1开始
int dist[maxnum]; // 表示当前点到源点的最短路径长度 int c[maxnum][maxnum]; // 记录图的两点间路径长度
int n, line; // 图的结点数和路径数 // n -- n nodes
// v -- the source node
// dist[] -- the distance from the ith node to the source node
// prev[] -- the previous node of the ith node
// c[][] -- every two nodes' distance
void Dijkstra(int n, int v, int *dist, vector<int> *prev, int c[maxnum][maxnum])
{
bool s[maxnum]; // 判断是否已存入该点到S集合中
for(int i=; i<=n; ++i)
{
dist[i] = c[v][i];
s[i] = ; // 初始都未用过该点
if(dist[i] < maxint)
prev[i].push_back(v);
}
dist[v] = ;
s[v] = ; // 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
// 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
// 注意是从第二个节点开始,第一个为源点
for(int i=; i<=n; ++i)
{
int tmp = maxint;
int u = v;
// 找出当前未使用的点j的dist[j]最小值
for(int j=; j<=n; ++j)
if((!s[j]) && dist[j]<tmp)
{
u = j; // u保存当前邻接点中距离最小的点的号码
tmp = dist[j];
}
s[u] = ; // 表示u点已存入S集合中 // 更新dist
for(int j=; j<=n; ++j)
if((!s[j]) && c[u][j]<maxint)
{
int newdist = dist[u] + c[u][j];
if(newdist <= dist[j])
{
if (newdist < dist[j]) {
prev[j].clear();
dist[j] = newdist;
}
prev[j].push_back(u);
}
}
}
} // 查找从源点v到终点u的路径,并输出
void searchPath(vector<int> *prev, int v, int u, int sta[], int len) {
if (u == v) {
cout<<v;
return ;
}
sta[len] = u;
for (int i = ; i < prev[u].size(); ++i ) {
if (i > ) {
for (int j = len - ; j >= ; --j) {
cout << " -> " << sta[j];
}
cout<<endl;
}
searchPath(prev, v, prev[u][i], sta, len + );
cout << " -> " << u;
}
} int main() {
//freopen("input.txt", "r", stdin);
// 各数组都从下标1开始
vector<int> prev[maxnum]; // 记录当前点的前一个结点
// 输入结点数
cin >> n;
// 输入路径数
cin >> line;
int p, q, len; // 输入p, q两点及其路径长度
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
c[i][j] = maxint; for(int i=; i<=line; ++i)
{
cin >> p >> q >> len;
if(len < c[p][q]) // 有重边
{
c[p][q] = len; // p指向q
c[q][p] = len; // q指向p,这样表示无向图
}
} for(int i=; i<=n; ++i)
dist[i] = maxint;
for(int i=; i<=n; ++i)
{
for(int j=; j<=n; ++j)
printf("%8d", c[i][j]);
printf("\n");
} Dijkstra(n, , dist, prev, c); cout << "源点到最后一个顶点的最短路径长度: " << dist[n] << endl;
cout << "源点到最后一个顶点的路径为: "<<endl;
int sta[maxnum];
searchPath(prev, , n, sta, );
} /* 5 8
1 2 10
1 4 20
1 5 100
2 3 10
3 5 10
4 3 10
4 5 10
2 5 20
999999 10 999999 20 100
10 999999 10 999999 20
999999 10 999999 10 10
20 999999 10 999999 10
100 20 10 10 999999
源点到最后一个顶点的最短路径长度: 30
源点到最后一个顶点的路径为:
1 -> 2 -> 5
1 -> 2 -> 3 -> 5
1 -> 4 -> 5请按任意键继续. . .
*/

注:(1)每次使用Dijkstra算法计算都会将prev中函数进行修改,因此需要将其进行CLEAR;

(2)目前的代码给出来将路径打印出来,但是还需要将其进行存储。后续更新。

基于dijkstra算法求地铁站最短路径以及打印出所有的路径的更多相关文章

  1. 通俗易懂理解——dijkstra算法求最短路径

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止 ###基本思想 通过Dij ...

  2. Dijkstra算法求单源最短路径

    Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...

  3. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  4. Dijkstra算法求最短路径(java)(转)

    原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...

  5. _DataStructure_C_Impl:Dijkstra算法求最短路径

    // _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...

  6. AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题

    在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...

  7. PAT Advanced 1030 Travel Plan (30) [Dijkstra算法 + DFS,最短路径,边权]

    题目 A traveler's map gives the distances between cities along the highways, together with the cost of ...

  8. Dijkstra算法——单源最短路径问题

    学习一个点到其余各个顶点的最短路径--单源最短路径 Dijkstra算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向 ...

  9. Dijkstra算法求最短路模板

    Dijkstra算法适合求不包含负权路的最短路径,通过点增广.在稠密图中使用优化过的版本速度非常可观.本篇不介绍算法原理.只给出模板,这里给出三种模板,其中最实用的是加上了堆优化的版本 算法原理 or ...

随机推荐

  1. Web Service--第一次接触web service

    Web Service 首发于开源中国 1. 背景 中国移动短信网关需求,要能够发送短信.开发材料只有一个短信发送配置:包括ID,password,code,url.一个jar包还有一个老旧的html ...

  2. 【PHP】数据类型转换

    PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: (int).(integer):转换成整形 (float).(double).(real):转换成浮点型 (string):转换成字符串 ...

  3. hiernate-session

    一.概述 Session 是 Hibernate 向应用程序提供操纵数据的主要接口,它提供了基本的保存.更新.删除和加载 Java 对象的方法. 二.Session 缓存 1.简介 (1)Sessio ...

  4. ASP.NET前台table通过Ajax获取绑定后台查询的json数据

    上一篇<ASP.NET前台html页面AJAX提交数据后台ashx页面接收数据>写了前台提交数据后台保存到数据库,数据处理以后用户肯定要查询.接下来就写一个前台table通过ajax  J ...

  5. 防止DDoS攻击的方式

    针对企业的DDoS攻击持续增长,根据Akamai的调查报告,2015年DDoS攻击增长了史无前例的180% !面对 DDoS 攻击性挑战,我们应该建立有效的防御体系来抵御攻击.   1.网站IP减少公 ...

  6. annotation-config, annotation-driven, compont-scan 区别

    <annotaion-driven/>标签: 这个标签对应的实现类是org.springframework.web.servlet.config.AnnotationDrivenBeanD ...

  7. 4.npm模块安装和使用(axios异步请求,lodash工具库)

    建立package.json npm init 下载包 npm install axios npm install lodash 下载包,并加到package里面 npm install axios ...

  8. LVS-负载均衡集群部署

    简介:LVS是一种集群技术,采用IP负载均衡技术和基于内容请求分发技术,调度器具有很好的吞吐量,将请求均衡的转移到不同服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能,高可 ...

  9. CSDN社区投诉申请表

    最近两天我发现我的个人网站,业余草:www.xttblog.com,流量急速下滑.经过分析,发现是被CSDN社区的一个博客网友将我网站上的内容搬到了他的CSDN博客上.导致了已搜索就全部导流到了CSD ...

  10. akoj-1074-人见人爱A^B

    人见人爱A^B Time Limit:1000MS  Memory Limit:65536K Total Submit:91 Accepted:55 Description 求A^B的最后三位数表示的 ...