先说迪杰斯特拉,先看题目吧。

题目1

这题就是迪杰斯特拉的路径记录算法题啊,还记录了最小路径个数。

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f
int dis[550];
int num[550];
bool vis[550];
int ne[550];
int p[550];
int g[550][550];
int n,m,s,d;
int path[550];
void out(int b)//这里就是路径的输出简单的递归。
{if(ne[b]==-1){cout<<b<<' ';return ;}out(ne[b]);cout<<b<<' ';
}
void dij()
{int tmp;dis[s]=0;num[s]=p[s];ne[s]=-1;int x;path[s]=1;for(int i=0;i<n;i++){tmp=inf;for(int j=0;j<n;j++){if(!vis[j]&&tmp>dis[j]){x=j;tmp=dis[j];}}vis[x]=1;for(int j=0;j<n;j++){if(!vis[j]&&dis[x]+g[x][j]<dis[j]){path[j]=path[x]; dis[j]=dis[x]+g[x][j];num[j]=num[x]+p[j];ne[j]=x;//记录路径这里表示j在最短路的上一个节点是x,这样我们之前记录了x的前一个节点这样一步一步往前推就可以推到源点了。}else if(!vis[j]&&dis[j]==dis[x]+g[x][j]){path[j]+=path[x];if(num[j]<num[x]+p[j]){num[j]=num[x]+p[j];ne[j]=x;}}}}cout<<path[d]<<' '<<num[d]<<endl;out(ne[d]);cout<<d<<endl;
}
int main(){ int x,y,k;cin>>n>>m>>s>>d;memset(g,0x3f,sizeof(g));memset(dis,0x3f,sizeof(dis));for(int i=0;i<n;i++)cin>>p[i];for(int i=0;i<m;i++){cin>>x>>y>>k;g[x][y]=k;g[y][x]=k; }dij();}

下面是flyod记录路径了,应该是用了动态规划思想。

代码如下。

for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{if(dis[i][j]>dis[i][k]+dis[k][j]){dis[i][j]=dis[i][k]+dis[k][j];path[i][j]=k;//这就是记录路径的数组了。}
} 

输出路径的代码。

void out(int i,int j)
{if(path[i][j]==0)return ;out(i,path[i][j]);cout<<path[i][j];out(path[i][j],j);}

这里所用的思想就是path[i][j]表示从i  到  j 必须经过path[i][j];

然后i 到 path[i][j]的路径以及 path[i][j]  到 j 的路径。

floyd和迪杰斯特拉算法的路径记录方法。相关推荐

  1. 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

    6 最短路径   最短路径,对于图来说,是两顶点之间经过的边数最少的路径:对于网来说,是指两顶点之间经过的边上权值之和最小的路径.路径上第一个顶点为源点,最后一个顶点是终点. 6.1 迪杰斯特拉(Di ...

  2. 迪杰斯特拉算法及变式(最短距离,打印路径,最短经过节点数)

    问题描述 给定一个图,图的节点名称用(000 ~ N−1N - 1N−1)表示.NNN为图的节点个数,MMM为边的个数,SSS为起始点. 输入条件: 第一行输入 NMSN M SNMS. 其后MMM行 ...

  3. 机器人路径规划之迪杰斯特拉算法(二)

    DFS和BFS 说迪杰斯特拉算法之前,先为大家简单介绍两种常见的图论搜索算法,深度优先(DFS),广度优先(BFS). 深度优先 深度优先就是从根节点开始,找到它的第一个子节点 在找到第一个子节点的子 ...

  4. 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)

    今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...

  5. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

  6. 迪杰斯特拉算法 两点间最短路径的选择

    百度首页 登录 注册 新闻网页贴吧知道音乐图片视频地图百科文库 首页 分类 艺术 科学 自然 文化 地理 生活 社会 人物 经济 体育 历史 特色百科 历史上的今天 数字博物馆 史记·2015 城市百 ...

  7. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

  8. 图的最短路径之迪杰斯特拉算法和弗洛伊德算法

    文章目录 一.迪杰斯特拉(Dijkstra)算法 1.定义描述 2.算法思想 3.算法步骤 4.算法图解 二.弗洛伊德(Floyd)算法 1.定义描述 2.算法思想 3.算法步骤 三.Dijkstra ...

  9. 透彻理解迪杰斯特拉算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,这个算法我主动学了三遍,第一主动学的时候,是看严蔚敏的<数据结构>,当时应该是学懂了,有点透彻地理解了这个算法,但是没有记录下来 ...

最新文章

  1. Codeforces Round #699 (Div. 2) (A ~ F)6题全,超高质量良心题解【每日亿题】2021/2/6
  2. 深度 | AI掘金,非富即亡
  3. richtextbox自动滚动到最下面_工业自动化直线运动部件大全,导轨、轴承、衬套、丝杠、导向轴简介说明...
  4. java 实现斐波切纳数列,求解这个算斐波切纳兔子有关问题的算法错哪了(和stl迭代器貌似有点关系)...
  5. ITK:获取图像中标记区域的几何属性
  6. 0.Overview----Machine Learning
  7. ios截屏 u3d导出Xcode工程截屏
  8. 数据清洗工具OpenRefine
  9. mysql drop 权限_MySQL procedure drop权限问题
  10. 给大家介绍一下实现Go并发同步原语的基石
  11. 论文笔记总结_S2D_从稀疏到稠密
  12. JQUERY弹层|图片滚动|插件开发|上传 相关收藏
  13. go c 语言,c语言与go语言的区别有哪些
  14. 十大经典算法及其优化
  15. php 输出中文文件名乱码,PHP fopen中文文件名乱码问题解决方案
  16. 计算机办公软件应用杂志,武汉计算机办公软件应用
  17. 卡巴斯基企业版本杀毒软件防火墙,支持windows服务器系统安装
  18. 中国有哪些python比赛_有哪些大学生值得参与的竞赛?
  19. MPB:猪胃肠道内容物和黏膜样品采集与微生物组成分析
  20. oracle jdbc执行,java jdbc 执行oracle存储过程

热门文章

  1. 2022-2028年中国儿童保健品行业市场研究及前瞻分析报告
  2. Go 知识点(02)— channel 使用不当导致的 deadlock
  3. Go 语言同一个包内函数调用、包名和实际路径最后一个目录不一致问题
  4. Git 常用操作(2)- 创建标签
  5. Linux shell 学习笔记(1)— 文件和目录(查看、创建、复制、软硬链接、重命名及删除操作)
  6. line_profile逐行代码分析
  7. Java单例模式个人总结(实例变量和类变量)
  8. LeetCode简单题之按奇偶排序数组 II
  9. 部署可扩展的目标检测管道:推理过程(下)
  10. 超声波技术构建触摸界面