用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。对于⽆向图⽽⾔,最短路径就是从源点V0到终点Vn所包含的边最少的路径

迪杰斯特拉算法

从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

假设图G{V,E},集合S为已经求出的当前距离顶点V0最短的顶点的集合,那么V-S就是待计算的顶点集合,定义数组d[]中保存顶点到各顶点的当前最短路径

基本思想如下:

  1. 令S={V0}
  2. 令d[i]=data[V0][i],也就是初始V0到其他点的距离
  3. 从V-S中选取一个d[]值最小的点v,把顶点加入到集合S中,再对集合V-S中的顶点i令d[i]=min{d[i],data[v][i]}
  4. 重复步骤3,直到S=V
public class Dijkstra {//存储最短路径下标数组int[] path;//存储当前最短路径的权值和int[] shortest;//存储顶点是否在集合S中int[] isExist;public Dijkstra(MGraph mGraph) {path = new int[mGraph.vNums];shortest = new int[mGraph.vNums];isExist = new int[mGraph.vNums];}public void dijkstra(MGraph mGraph,int V0){//初始化数组for (int i = 0; i < mGraph.vNums; i++) {path[i] = 0;isExist[i] = 0;shortest[i] = mGraph.arcs[V0][i];}isExist[V0] = 1;//将V0加入集合Sint k = 0;//d[]最小的点int min = Integer.MAX_VALUE;//开始循环,每次求得V0到每个结点的最短路径和for (int i = 1; i < mGraph.vNums; i++) {//从V-S中选取一个d[]值最小的点vfor (int j = 0; j < mGraph.vNums; j++) {min = Integer.MAX_VALUE;if(isExist[j] == 0 && shortest[j] < min){min = shortest[j];k = j;}}isExist[k] = 1;//将d[]最小的点加入集合S中//更新当前最短路径权值和for (int j = 0; j < mGraph.vNums; j++) {if(isExist[j] == 0 && (shortest[j] < min + mGraph.arcs[k][j])){shortest[j] = min + mGraph.arcs[k][j];path[j] = k;}}}}
}

弗洛伊德算法

是一种利用动态规划的思想寻找给定的有权图中多源点之间的最短路径的算法,与迪杰斯特拉类似。

单源最短路径的迪杰斯特拉算法需要辅助数组d[],同样多源最短路径弗洛伊德算法也需要辅助二维数组D[][]

基本思想就是递归的产生矩阵A0 A1...An,矩阵Ak[i][j]表示从顶点i到顶点j以不大于下标k的顶点为途径点的最短路径长度,An-1就是最终结果

令A-1[i][j]=data[i][j],表示从顶点i到顶点j且中间不经过任何顶点的最短路径长度,也就是最原始的直线距离。

然后在所有的路径中增加中间顶点V0,如果得到的的新路径长度小于原来的路径长度,那么就以新的路径长度替换原来的路径长度。也就是对每一个矩阵元素A0[i][j] = min{A-1[i][j] =,A-1[i][0]+A0[0][j]}

依此再添加V1、V1....Vn,最后得到的矩阵就是运算结果

public class Floyd {//存储最短路径下标int[][] path;//最短路径权值和int[][] shortest;public Floyd(MGraph mGraph) {path = new int[mGraph.vNums][mGraph.vNums];shortest = new int[mGraph.vNums][mGraph.vNums];}public void floyd(MGraph mGraph){//初始化for (int i = 0; i < mGraph.vNums; i++) {for (int j = 0; j < mGraph.vNums; j++) {shortest[i][j] = mGraph.arcs[i][j];path[i][j] = j;}}for(int i =0;i<mGraph.vNums;i++){for (int j = 0; j < mGraph.vNums; j++) {for (int k = 0; k < mGraph.vNums; k++) {if(shortest[j][k]<shortest[j][i]+shortest[i][k]){shortest[j][k] = shortest[j][i]+shortest[i][k];path[j][k] = k;}}}}}
}

最短路径(迪杰斯特拉、弗洛伊德含代码)相关推荐

  1. 简述dijkstra算法原理_理解最短路径——迪杰斯特拉(dijkstra)算法

    1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科学家狄克斯特拉于1959年提出,用来求得从起始点到其他所有点 ...

  2. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

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

  3. >算法笔记-动态规划-最短路径迪杰斯特拉算法

    算法笔记-动态规划-最短路径迪杰斯特拉算法 作者:星河滚烫兮 前言   图的最短路径问题在现实生活中有很广阔的应用,最短路径又分为单源最短路径与多源最短路径,前者求出固定起点到其他节点的最短路径,后者 ...

  4. 别说了,世界那么大我想去看看!(最短路径-迪杰斯特拉算法弗洛伊德算法)

    前言: 一直想去外面的世界看看,中国城市那么多,那么美,怎么样才可以用最少的钱,最短的时间游遍我想去的城市呢?(我在做梦?不不不!迪杰斯特拉算法和弗洛伊德算法来了)      这两个算法有着广泛的用途 ...

  5. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  6. 最短路径——迪杰斯特拉算法——图的数据结构

    最短路径是在工程上经常用到的概念,在这里给出了从单源点到任意顶点的迪杰斯特拉算法. 先来看看基本概念: 用代码C语言实现如下: #include<string.h>#include< ...

  7. 03 优先搜索(dfs bfs)、最小生成树(笛卡尔 prime)、两点最短路径(迪杰斯特拉 Floyd)

    #include<bits/stdc++.h> using namespace std; void bfs(){for(int i=1;i<=n;i++)v[i]=0;queue&l ...

  8. 【图】最短路径--迪杰斯特拉(Dijkdtra)算法

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

  9. 最短路径迪杰斯特拉算法--邻接矩阵

    一.算法介绍 迪杰斯特拉算法(解决单源最短路径) 基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径. 基本步骤:1,设置标记数组bo ...

  10. 六、最短路径——迪杰斯特拉(Dijkstra)算法

    在网图和非网图中,最短路径的含义是不同的.由于非网图它没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并 ...

最新文章

  1. Ubuntu 上创建常用磁盘阵列
  2. linux重设mysql密码是多少_Linux学习:重设mysql root密码
  3. vue,html2canvas,网页div保存为图片
  4. 明机器人孔尧是哪里人_明机器人孔尧:希望未来打造场景机器人交流平台
  5. 《1024伐木累》-小白篇之需求-总章节八
  6. ASP.NET删除等操作前的提示解决方案
  7. 画矩形的方法_怎样画颜色绚丽的插画?
  8. uva1382 Distant Galaxy
  9. matlab的lambda,matlab lambda 级数
  10. PSP看电视软件测试,实战测试:PSP上运行Windows 95
  11. 安卓修改大师功能简介
  12. matlab语音信号生成语谱图,基于MATLAB的语音信号采集和语谱图分析
  13. mysql cmd 常用命令
  14. php 搜索引擎 分词_怎么在php中使用scws实现一个中文分词搜索功能
  15. 连接摄像头拍照并识别图片中二维码
  16. 三维图像的Dice系数计算
  17. java c HTML,javac html标签
  18. 每天温习一个JS方法之Array.flat方法 第六天
  19. 我所知道的中国NLP「破圈」十年
  20. javaweb项目实战--学生管理系统

热门文章

  1. 地图附近名片流量主小程序开发
  2. 企业转型升级,务必抓住“企业上云”政策红利
  3. 计算机视觉论文速递(七)FAN:提升ViT和CNN的鲁棒性和准确性
  4. 二、ADS实现阻抗匹配的三种案例(二)
  5. 怎么抓雷电模拟器的包_fiddler+雷电模拟器进行APP抓包(可抓HTTPS)
  6. uni-app 超好用的时间选择器组件(起止时间)
  7. php网站开发期末大作业,网页设计期末大作业报告..doc
  8. python好看图案的编程代码_只需15行Python代码,实现图像定位功能
  9. 新一代光学工程仿真软件FRED MPC介绍
  10. 骁龙8gen1性能怎么样 骁龙8gen1和苹果A15 哪个强