最短路径算法—狄杰斯特拉算法

一.介绍

这是一种按照路径长度递增的次序产生最短路径的算法,采用的是贪心的思想,对带权图(有向和无向均可)寻找最短路径;该算法对于不含负权的网来说,是目前已知的最快的单源最短路径算法,时间复杂度为o(n^2)

二.算法介绍与代码实现

首先我们看以这张图为例:

该图的领接矩阵表示为:

1.首先我们需要三个数组(数组下标从1开始)
mark:用来标记单源顶点(我们这里取为顶点1)到该顶点的最短路径是否已经求到了
dist:标志单源顶点到该顶点的最短路径长度
path:表示到该节点的前驱节点
2.三个数组初始化
mark: 1 0 0 0 0
dist: 0 3 ∝{\propto}∝ ∝{\propto}∝ 30
path: 0 1 1 1 1
3.算法开始
狄杰斯特拉算法的核心思想是通过已有的最短路径以他为参照来优化到其他顶点的最短路径。
简单的概括过程就是每次从mark=0的顶点中去寻找dist最小的那个点那么这个点的最短路径就找到了,接下来从该顶点出发把剩下的mark=0的顶点的dist进行一遍优化(注意是优化,此时不一定是最短的路径),当然在上述过程中要注意对mark与path的更新,下面我们用上面的例子演示一下。
mark: 1 0 0 0 0
dist: 0 3 ∝{\propto}∝ ∝{\propto}∝ 30
path: 0 1 1 1 1
找从mark=0最小的dist,即3,于是更新得到,mark[2]=1,path[2]就是1不用更新,然后用得到的新的最短路径去更新剩下的mark=0,那么有dist[3]=3+25<∝{\propto}∝,dist[4]=3+8<∝{\propto}∝,dist[5]仍然为30,因为3+∝{\propto}∝>30,同时更新path[3]=2,path[4]=2
此时:
mark: 1 1 0 0 0
dist: 0 3 28 11 30
path: 0 1 2 2 1
接下来按照上面的方式最后得到

4.代码实现

import org.junit.Test;import java.util.Scanner;
public class Test1 {int INFINITY = 65535;int [][]Vertex={{},{0,0,3,INFINITY,INFINITY,30},{0,INFINITY,0,25,8,INFINITY},{0,INFINITY,INFINITY,0,INFINITY,10},{0,20,INFINITY,4,0,12},{0,5,INFINITY,INFINITY,INFINITY,0}};//领接矩阵int []mark={0,1,0,0,0,0};int []path={0,0,1,1,1,1};int []dist={0,0,3,INFINITY,INFINITY,30};@Testpublic void Test() {Dijstra(5);for(int i=1;i<=5;i++){System.out.print(mark[i]+" ");}System.out.println();for(int i=1;i<=5;i++){System.out.print(dist[i]+" ");}System.out.println();for(int i=1;i<=5;i++){System.out.print(path[i]+" ");}}//传入顶点数void Dijstra(int n){int marknum=n-1;//记录0的个数int index;while (marknum>=1){index = Find(n);mark[index]=1;//表示找到最短路径了for(int i=1;i<=n;i++){if(mark[i]==0&&Vertex[index][i]+dist[index]<dist[i]){dist[i]=Vertex[index][i]+dist[index];path[i]=index;}}marknum--;}}//寻找mark为0的dist最小顶点int Find(int n){int index = 1;while(mark[index]!=0)index++;int min = dist[index];for(int i=index+1;i<=n;i++){if(mark[i]==0&&dist[i]<min) {index=i;min=dist[i];}}return index;}
}

输出:

1 1 1 1 1
0 3 15 11 23
0 1 4 2 4

当然上面的图的信息都是直接保存在数组里面,我们也可以定义Graph类,在构造方法中完成初始化

//定义图类
class Graph{int INFINITY = 65535;int [][]Vertex;//领接矩阵int []mark;int []path;int []dist;String[] name;//记录每个节点的别名Scanner scanner;public  Graph(){//输入节点的个数scanner = new Scanner(System.in);System.out.println("请输入顶点的个数");int n =  scanner.nextInt();System.out.println("请输入边的个数");int numEdge = scanner.nextInt();mark = new int[n+1];mark[1]=1;path = new int[n+1];for(int i=1;i<=n;i++)path[i]=1;dist = new int[n+1];Vertex = new int[n+1][n+1];for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(i!=j)Vertex[i][j]=INFINITY;}for(int i=2;i<=n;i++)dist[i]=Vertex[1][i];name = new String[n+1];System.out.println("请依次输入每个顶点的名字");for(int i=1;i<=n;i++){name[i]=scanner.next();}System.out.println("请依次输入每条边,输入方式为:顶点1编号 顶点2编号 权重");int row,col,weight;for(int i=1;i<=numEdge;i++){row = scanner.nextInt();col = scanner.nextInt();weight = scanner.nextInt();Vertex[row][col]=weight;}scanner.close();}//打印领接矩阵public  void printVertex(){for (int[] vertex : Vertex) {for (int i : vertex) {System.out.print(i+" ");}System.out.println();}}//传入顶点数void Dijstra(int n){int marknum=n-1;//记录0的个数int index;while (marknum>=1){index = Find(n);mark[index]=1;//表示找到最短路径了for(int i=1;i<=n;i++){if(mark[i]==0&&Vertex[index][i]+dist[index]<dist[i]){dist[i]=Vertex[index][i]+dist[index];path[i]=index;}}marknum--;}}//寻找mark为0的dist最小顶点int Find(int n){int index = 1;while(mark[index]!=0)index++;int min = dist[index];for(int i=index+1;i<=n;i++){if(mark[i]==0&&dist[i]<min) {index=i;min=dist[i];}}return index;}
}

最短路径算法---狄杰斯特拉算法相关推荐

  1. VC++2012编程演练数据结构《31》狄杰斯特拉算法

    狄杰斯特拉算法 Dijkstra(狄杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很 ...

  2. c++ 单源最短路径-狄杰斯特拉算法

    文章目录 源码 输出 狄杰斯特拉算法 适用范围:没有负权重的图, 可以有环,有向无向图均可 求解问题:单源最短路径 时间复杂度:V^2 源码 #include <iostream> #in ...

  3. 算法 --- 狄杰斯特拉(Dijkstra)算法的Java实现

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

  4. C++狄杰斯特拉算法(Dijkstra)实现最短路问题

    狄杰斯特拉算法(Dijkstra): 基本思想: 看不懂?没关系,i哲来带你通过具体问题理解这个算法 问题描述: 找出从商家到学校的最短路径 多组输入,对于每组数据. 第一行输入N,M,分别表示大街上 ...

  5. 狄杰斯特拉算法 vs A_star 算法

    杂谈 狄杰斯特拉算法(以下简称为D 算法)和A* 算法,网上的学习资料很多,在此不在赘述.以下做出几点总结: 1.D 算法 是可以可以获取一个全局最优解. 2.但是A* 算法 只有在 启发代价h &l ...

  6. c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法

    小禹禹们,你们好,景禹最近已经开学,忙着准备毕业答辩的事情,这才抽身个大家更新文章,还请莫怪.生活实属不易,有时候让人有点儿焦头烂额,甚至想让景禹放弃继续更新文章,可是千百号人默默地关注者景禹,当然也 ...

  7. 图的应用——最短路径(迪杰斯特拉算法)

    Content 1. 什么是最短路径 2. 迪杰斯特拉算法[O(n^2^)] 3. 代码 4. 迪杰斯特拉算法 VS 普利姆算法 1. 什么是最短路径 在一个带权有向图中,从某一顶点到另一顶点可能有很 ...

  8. Java 图的最短路径问题-迪杰斯特拉算法VS弗洛伊德算法

    1.迪杰斯特拉算法VS弗洛伊德算法 迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径: 弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一 ...

  9. 算法图解---狄杰斯特拉算法(原理+代码)

    要编写解决这个问题的代码,需要三个散列表. 随着算法的进行,你将不断更新散列表costs和parents.首先,需要实现这个图,为此可像第6章那样使用一个散列表,样将节点的所有邻居都存储在散列表中.但 ...

最新文章

  1. ndarray维度认识及np.concatenate函数详解
  2. HDOJ 1214 圆桌会议
  3. 达观数据分析平台架构和Hive实践——TODO
  4. 循序渐进DB2.DBA系统管理、运维与应用案例pdf
  5. codeforces F.F. Teodor is not a liar! 最长不降子序列
  6. 物联网在水位监测中的应用
  7. github 上传代码_leetcode爬虫:爬取代码;生成readme;上传github
  8. 3 .6 .5 优化Ad-Hoc工作负载
  9. Android中如何查看内存(上)
  10. 手机html滚动原理,手机滚动-如何实现惯性滚动
  11. C++新特性探究(十一):enum class(struct)
  12. leedcode刷题——整数反转
  13. Linux(Ubuntu)常用命令(五)—— vi/vim常用操作
  14. vba动态二维数组_VBA学习笔记19:数组1
  15. bash shell学习的记录(一)
  16. 一文教你用squid将闲置的服务器搭建成爬虫使用的高匿代理服务器
  17. MyBatisPlus自动填充
  18. asp.net mvc 连接sqlserver数据库
  19. python画图网格线设置_PyPlot设置 plot的网格线间距_matplotlib_酷徒编程知识库
  20. VTK笔记-图形相关-多边形数据转换图像数据-vtkPolyData转换为vtkImageData

热门文章

  1. 不用费劲,这5款效率工具为你解决学习工作烦恼
  2. 神经网络模型可解释性,典型的神经网络模型
  3. 移动端真机调试修改手机host
  4. 计算机网络防雷器,网络防雷器 - 宇泰(UTEK) - 全球领先智能通讯解决方案提供商!...
  5. 关于python的英文参考文献_中英文参考文献
  6. 华为手机怎么设置APP开机启动管理将自动管理修改成手动管理?
  7. redhat 6 Probing EDD (edd=off to disable)...
  8. 博通第二季净利润37.33亿美元,同比增长700%
  9. 黑马程序员-Java基础:面向对象(上)
  10. 问题记录--25端口邮件发送失败