最短路径算法:

1:Dijkstra     2:Floyd     3:Bellman-Ford     4:SPFA     5:A*

这五种最短路径算法初学的时候非常容易混淆,因为他们的松弛方法都差不多,而他们的核心却又与松弛有着很密切的关系,所以很难去辨别区别。

1:Dijkstra

Dijkstra算法适用于单源最短路,也就是从一个点到终点,过程比较贪心,逻辑上是寻求最近点来逐步拓展,以达到局部最优的效果,再由局部最优一一推出全局最优

实现过程:建立dist数组存与原点的距离

1:从全部点中找离确定点(一开始是初始点)最近的点。

2:找到后将它设置为确定点(第二次查找就从他开始了)

3:全局搜索现在这个确定点能扩展到的所有点(也就是与确定点相连的点)(判断能否连通了可以用e[i][j]<inf来判断)

4:松弛操作:看看由原点直达这个点近还是经过确定点近

dist[v]>dist[u]+e[u][v]

5:能扩展就扩展,扩展完后这个点的dist就是到原点的最短距离

6:那么扩展到dist[n]的话,最短距离就是dist[n]

整体思想:找最近点将它们达到的点逐步扩展,更新他们到原点的最短距离。

代码链接:(精简代码+堆优化)

https://blog.csdn.net/Syclus/article/details/123093141?spm=1001.2014.3001.5501

代码:二维存数版本

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;int main()
{int e[10][10],dis[10],book[10],n,m,t1,t2,t3,u,v,min;int inf=99999999;cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)//初始化过程 {if(i==j)//对角线为0(与自身的距离=0) e[i][j]=0;elsee[i][j]=inf;}} for(int i=1;i<=m;i++){cin>>t1>>t2>>t3;e[t1][t2]=t3; } for(int i=1;i<=n;i++)//初始化dis,与1的距离 dis[i]=e[1][i];memset(book,0,sizeof book);//看看当前位置有没有被确定 book[1]=1;//1点开始走当然确定了 for(int i=1;i<=n-1;i++)//大循环为n-1次,就一计数的 {//更新n-1个点所以才这样 min=inf;for(int j=1;j<=n;j++)//找最近点 {if(book[j]==0 && dis[j]<min)//走过就不用了 {min=dis[j];u=j;}} book[u]=1;//确定最近点for(v=1;v<=n;v++){if(e[u][v]<inf)//能联通{if(dis[v]>dis[u]+e[u][v])dis[v]=dis[u]+e[u][v];} } } for(int i=1;i<=n;i++)cout<<dis[i]<<" ";cout<<endl;return 0;} 

2:Floyd(自由:任意两点最短路、过前几个点求最短路)

Floyd算法适用于多源最短路问题,求的是任意两个点的最短路问题,注重的是这个最短路径有没有考虑到所有点,总共三层循环On3,内两层循环统计只考虑过一点的话任意两点之间的最短路(i,j之间最短的距离),最外层循环过k点。这个完全可以根据需求来定,想过几点求最短路,或者哪一点到哪一点都可以。

代码:

for(int k=1;k<=n;k++)//记住是先算只允许经过1点更新完后,再更新只经过2点
{//所以一遍一遍更新下来,最短路会越来越完善for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(e[i][j]>e[i][k]+e[k][j])//过k点的话可不可以优化e[i][j]=e[i][k]+e[k][j];}}
}

3:Bellman-Ford算法:(有负权边)

算法思路:

1.迭代n次(假设迭代了k次,含义:从1号点,走不超过k条边到达所有点的最短距离)

2.每次循环所有边,for(所有边 a,b,w)

3.每次松弛操作:dist[b]=min(dist[b],dist[a]+w)

(可以保证三角不等式,每一个dist[b]<dist[a]+w)

(遇到有边数限制的题目,用backup数组备份一下上次的迭代结果,防止数据串联)

五种最短路径算法的总结(待更新)相关推荐

  1. 详解五种最短路径算法及其区别(c++)

    目录 一.朴素Dijkstra算法 二.堆优化的Dijkstra 三.bellman_ford算法 四.spfa算法 五.floyd算法 使用区别: 所有边权都是正数的单源最短路:朴素Dijkstra ...

  2. 图的五种最短路径算法

    本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,费罗伊德算法,迪杰斯特拉算法,Bellman-Ford 算法. 1)深度或广度优先搜索算法(解决单源最短路径) 从起点开始访问所有深度遍历 ...

  3. 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...

    java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法 public class City { String name; int id; static int idCounter = ...

  4. 图的四种最短路径算法

    本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法 1),深度或广度优先搜索算法(解决单源最短路径) 从起始结点开始访问所有的深度 ...

  5. 图论:图的四种最短路径算法

    目录: 1.DFS(单源最短路径算法) 例题1: DFS题目分析: 代码DFS: 2.Floyed(时间复杂度On^3) 1.应用场景: 2.解析算法: 核心代码1: 我的笔记 核心代码2: Floy ...

  6. 4.聚类的五种主要算法

    原博文: 聚类是一种机器学习技术,它涉及到数据点的分组.给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组.理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该 ...

  7. c++多元线性回归_五种优化算法实现多元线性回归

    实现多元线性回归的要求及假设条件: '''线性回归的假设条件:1.样本独立,即每个预测样本之间没有依赖关系:2.残差e要服从正态分布,即y_true-y_pred的残差需要服从高斯分布:3.特征之间独 ...

  8. a*算法的优缺点_五种聚类算法一览与python实现

    大家晚上好,我是阿涛. 今天的主题是聚类算法,小结一下,也算是炒冷饭了,好久不用真忘了. 小目录: 1.K-means聚类2.Mean-Shift聚类3.Dbscan聚类4.层次聚类5.GMM_EM聚 ...

  9. 数组的常用五种排序算法

    目录 一.排序算法介绍 二.算法代码实现 1.选择法排序 2.冒泡法排序 3.交换法排序 4.插入法排序 5.折半法排序 一.排序算法介绍 1.选择法排序 选择法排序在排序过程中一共需要进行 n(n- ...

最新文章

  1. MJExtension简介
  2. android 之自定义适配器(重写的getView()方法中convertView元素的妙用)一个实例
  3. springboot-springmvc响应json与xml原理-详解数据响应与内容协商(长文预警,收藏慢啃)
  4. 关系到了冰点_和丈夫的关系到了冰点,该怎么办?
  5. matlab引擎函数,Matlab引擎库函数
  6. 如何真正提高ASP.NET网站的性能
  7. .NET 6新特性试用 | 总结:我最喜欢的5个特性
  8. C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]
  9. SAP License:SAP 各个模块含义
  10. c语言编程打印格式输出总结
  11. 清北第一套题(zhx)
  12. 190606每日一句
  13. 修改php.ini以达到 屏蔽错误信息
  14. oracle startup open ora 03113,startup mount备库的时候报ORA-03113错误
  15. Tuxera2022Mac系统读写NTFS磁盘工具装机必备
  16. [硬件]超能课堂(181):我们为什么需要4+8pin CPU供电接口?
  17. 阿里云上创建 对象存储oss
  18. JavaScript 移动元素并使其原路返回
  19. 分享 23 个在线学习 JavaScript 的网站
  20. Microsoft同步工具SyncToy

热门文章

  1. maya 表达式编辑器无法正常打开(2)
  2. UE4项目多人协同开发
  3. Metrics,入门到应用
  4. 安忆往昔的唯美伤感空间日志发布:那杯白开水,很伤很美
  5. 登记成绩之小东助手v1
  6. html.partial传递参数,笔记:Html.Partial和Html.Action
  7. 帆软链接greenplum
  8. Android代码混淆之混淆规则
  9. SourceTree更新远程分支列表
  10. 数据中心末端配电的数字化方案及设备选型