floyd和迪杰斯特拉算法的路径记录方法。
先说迪杰斯特拉,先看题目吧。
题目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和迪杰斯特拉算法的路径记录方法。相关推荐
- 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)
6 最短路径 最短路径,对于图来说,是两顶点之间经过的边数最少的路径:对于网来说,是指两顶点之间经过的边上权值之和最小的路径.路径上第一个顶点为源点,最后一个顶点是终点. 6.1 迪杰斯特拉(Di ...
- 迪杰斯特拉算法及变式(最短距离,打印路径,最短经过节点数)
问题描述 给定一个图,图的节点名称用(000 ~ N−1N - 1N−1)表示.NNN为图的节点个数,MMM为边的个数,SSS为起始点. 输入条件: 第一行输入 NMSN M SNMS. 其后MMM行 ...
- 机器人路径规划之迪杰斯特拉算法(二)
DFS和BFS 说迪杰斯特拉算法之前,先为大家简单介绍两种常见的图论搜索算法,深度优先(DFS),广度优先(BFS). 深度优先 深度优先就是从根节点开始,找到它的第一个子节点 在找到第一个子节点的子 ...
- 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)
今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...
- 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)
最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...
- 迪杰斯特拉算法 两点间最短路径的选择
百度首页 登录 注册 新闻网页贴吧知道音乐图片视频地图百科文库 首页 分类 艺术 科学 自然 文化 地理 生活 社会 人物 经济 体育 历史 特色百科 历史上的今天 数字博物馆 史记·2015 城市百 ...
- 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】
图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...
- 图的最短路径之迪杰斯特拉算法和弗洛伊德算法
文章目录 一.迪杰斯特拉(Dijkstra)算法 1.定义描述 2.算法思想 3.算法步骤 4.算法图解 二.弗洛伊德(Floyd)算法 1.定义描述 2.算法思想 3.算法步骤 三.Dijkstra ...
- 透彻理解迪杰斯特拉算法
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,这个算法我主动学了三遍,第一主动学的时候,是看严蔚敏的<数据结构>,当时应该是学懂了,有点透彻地理解了这个算法,但是没有记录下来 ...
最新文章
- Codeforces Round #699 (Div. 2) (A ~ F)6题全,超高质量良心题解【每日亿题】2021/2/6
- 深度 | AI掘金,非富即亡
- richtextbox自动滚动到最下面_工业自动化直线运动部件大全,导轨、轴承、衬套、丝杠、导向轴简介说明...
- java 实现斐波切纳数列,求解这个算斐波切纳兔子有关问题的算法错哪了(和stl迭代器貌似有点关系)...
- ITK:获取图像中标记区域的几何属性
- 0.Overview----Machine Learning
- ios截屏 u3d导出Xcode工程截屏
- 数据清洗工具OpenRefine
- mysql drop 权限_MySQL procedure drop权限问题
- 给大家介绍一下实现Go并发同步原语的基石
- 论文笔记总结_S2D_从稀疏到稠密
- JQUERY弹层|图片滚动|插件开发|上传 相关收藏
- go c 语言,c语言与go语言的区别有哪些
- 十大经典算法及其优化
- php 输出中文文件名乱码,PHP fopen中文文件名乱码问题解决方案
- 计算机办公软件应用杂志,武汉计算机办公软件应用
- 卡巴斯基企业版本杀毒软件防火墙,支持windows服务器系统安装
- 中国有哪些python比赛_有哪些大学生值得参与的竞赛?
- MPB:猪胃肠道内容物和黏膜样品采集与微生物组成分析
- oracle jdbc执行,java jdbc 执行oracle存储过程