算法

参考资源:https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/

百度百科:迪杰斯特拉算法是于1959 年由荷兰计算机科学家狄克斯特拉提出的。是从一个节点到其余各节点的最短路径算法,解决的是有向或者无向加权重图中最短路径问题。迪杰斯特拉算法的主要特点是以起始点为中心,向外层层扩展,应用了典型的贪心算法。
1)创建一个集sptSet(最短路径集),它跟踪最短路径中包含的顶点,即,计算并最终确定与源的最小距离。 最初,这个集合是空的。
2)为输入图中的所有顶点指定距离值。 将所有距离值初始化为INFINITE。 将源顶点的距离值指定为0,以便首先拾取它。
3)虽然sptSet不包括所有顶点
     a)选择sptSet中不存在的顶点u并且具有最小距离值。
     b)将你包括在sptSet中。
     c)更新u的所有相邻顶点的距离值。 要更新距离值,请遍历所有相邻顶点。 对于每个相邻顶点v,如果u(来自源)和边缘u-v的权重的距离值之和小于v的距离值,则更新v的距离值

如图所示:无向图

Java构建邻接矩阵:

new int[][]{{0, 4, 0, 0, 0, 0, 0, 8, 0},
                                {4, 0, 8, 0, 0, 0, 0, 11, 0},
                                {0, 8, 0, 7, 0, 4, 0, 0, 2},
                                {0, 0, 7, 0, 9, 14, 0, 0, 0},
                                {0, 0, 0, 9, 0, 10, 0, 0, 0},
                                {0, 0, 4, 14, 10, 0, 2, 0, 0},
                                {0, 0, 0, 0, 0, 2, 0, 1, 6},
                                {8, 11, 0, 0, 0, 0, 1, 0, 7},
                                {0, 0, 2, 0, 0, 0, 6, 7, 0}
                                }

Java程序:

package shu_quan.greedy;import java.util.*; import java.lang.*;
import java.io.*; /*** * @author //代码由 Aakash Hasija and Lamb_quan提供**/
/**  针对带权重(非负)邻接矩阵图的算法,使用Java语言实现狄克斯特拉(Dijkstra)算法,*  解决单源最短路径问题。*/class ShortestPathWithList
{ //找出当前节点u到节点v(还没有包括在最短路径中的节点)的最小值static final int V=9; int minDistance(int dist[], Boolean sptSet[]) { // 初始化最小值为无穷大的替代形式int min = Integer.MAX_VALUE, min_index=-1; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) { min = dist[v]; min_index = v; } return min_index; } // 该函数是输出函数,打印结果void printSolution(int dist[], int n,ArrayList<ArrayList<Integer>> allPath) { System.out.println("运行结果如下:"); for (int i = 0; i < V; i++) System.out.println("源节点到节点"+i+"最短路径长度为:"+dist[i]+"     径路为:"+allPath.get(i)); } //该函数实现了邻接矩阵表示图的Dijkstra单源最短路径算法void dijkstra(int graph[][], int src) { //输出数组为源节点src到目的节点i的最短路径值dist[i]int dist[] = new int[V]; //,如果节点i被包含在从源节点到i节点的最短路径中,那么就将对应的节点设置trueBoolean sptSet[] = new Boolean[V]; //初始化全部标志为默认false,最短路径距离值为无穷大的替代形式。for (int i = 0; i < V; i++) { dist[i] = Integer.MAX_VALUE; sptSet[i] = false; } //初始化容器V条路径,默认应该是nullArrayList<ArrayList<Integer>> allPath = new ArrayList<ArrayList<Integer>>();for (int i = 0; i < V; i++) {allPath.add(new ArrayList<>());}// 源节点到自己的距离为 0 dist[src] = 0; // 找出所有节点的最短路径for (int count = 0; count < V; count++) { //从未被标记的所有最短路径值的集合中,找出值最小的节点作为u节点。//第一次总是源节点本身。int u = minDistance(dist, sptSet); //选择起点       ArrayList<Integer> onePath = allPath.get(u);onePath.add(u);// 被选的u节点作为最短路径的过渡节点并且标记true sptSet[u] = true; // Update dist value of the adjacent vertices of the // picked vertex. //更新可达的相邻的节点的最短路径值for (int v = 0; v < V; v++) //1、只会更新还未被标记的节点,且满足到邻近节点的距离不能为0,//2、满足过渡节点的最短路径值不能无穷大,//3、满足加上邻近节点的最短路径值小于之前到该临近节点的值//条件全部满足更新最短路径值,并添加该节点更新路径if(!sptSet[v] && graph[u][v]!=0 && dist[u] != Integer.MAX_VALUE && dist[u]+graph[u][v] < dist[v]) {dist[v] = dist[u] + graph[u][v]; /* * 增加节点比之前的路径短,因此要复制之前的路径再加上此节点*///获取该节点对应的路径ArrayList<Integer> localPath = allPath.get(v);//复制之前先清空路径。localPath.clear();//将上一个状态包括u节点的路径联结到此节点vlocalPath.addAll(onePath);  //不包含此节点就添加该节点if(localPath.contains(v)) {                           localPath.add(v);}}} // 输出结果:源节点到每个节点的距离,具体路径 printSolution(dist, V, allPath); //打印标记for (int i = 0; i < V; i++) System.out.println(i+" 标记: "+sptSet[i]); } // main函数public static void main (String[] args) { /* 创建一个带权重的无向邻接矩阵的图 */int graph[][] = new int[][]{{0, 4, 0, 0, 0, 0, 0, 8, 0}, {4, 0, 8, 0, 0, 0, 0, 11, 0}, {0, 8, 0, 7, 0, 4, 0, 0, 2}, {0, 0, 7, 0, 9, 14, 0, 0, 0}, {0, 0, 0, 9, 0, 10, 0, 0, 0}, {0, 0, 4, 14, 10, 0, 2, 0, 0}, {0, 0, 0, 0, 0, 2, 0, 1, 6}, {8, 11, 0, 0, 0, 0, 1, 0, 7}, {0, 0, 2, 0, 0, 0, 6, 7, 0} }; ShortestPathWithList t = new ShortestPathWithList(); t.dijkstra(graph, 0); }
} 

控制台输出:

Dijkstra(狄克斯特拉)求加权重的邻接矩阵最短路径(初级版)相关推荐

  1. 最短路径--Dijkstra(狄克斯特拉)算法

    最短路径 路径的概念:       在一个无权的图中,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减 1 .        由于从一顶点到另一顶 ...

  2. Dijkstra(狄克斯特拉) 算法

    文章目录 加权图 算法步骤 算法实现: 适用场景: 负权边 该算法是一种计算有向无环图最短路径的算法. 加权图 其中每个数字表示时间.要计算非加权图中的最短路径,可使用广度优先搜索.要计算加权图中的最 ...

  3. 狄克斯特拉(Dijkstra)算法详解

    1.前言 最近在看<算法图解>,其中第七章狄克斯特拉算法个人感觉并没有讲的清楚,比如看完7.1节给人的感觉是狄克斯特拉算法会遍历图中的每一条边,后续狄克斯特拉不适用负权边的说法就站不住脚了 ...

  4. 算法图解-狄克斯特拉算法

    本章内容: 加权图-提高或者降低某些边的权重 狄克斯特拉算法,能找出加权图中前往x的最短路径 图中的环,它导致狄克斯特拉算不管用 7.1狄克斯特拉算法 4个步骤: 找出最便宜的节点,即最短时间内前往的 ...

  5. 狄克斯特拉(Dijkstra)算法求一个顶点到其余各个顶点的最短路径

    不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 1.狄克斯特拉(Dijkstra)算法 采用狄克斯特拉(Dijkstra)算法可以求带权图( ...

  6. 狄克斯特拉(Dijkstra)算法原理详细解释与实现(python)

    目录 写在前面 1. 简介 2. 原理 2.1 找出最便宜的节点 2.2 计算前往该节点的各个邻居的开销 2.3 重复上面的步骤 实现 总结 写在前面 本文原理摘自<算法图解>这本书. 其 ...

  7. 最短路径--狄克斯特拉(Dijkstra)算法

    最短路径 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 Dijkstra算法 算法来源 Dijkstra算法是由一个叫Dijkstra的荷兰人发明的,故称此算法 ...

  8. 算法快学笔记(十三):狄克斯特拉(Dijkstra)算法原理与实现

    1. 简介 广度优先算法可以找出段数最少的路径,但是对于路径上带权重的图,想要找出最快的路径,则需要使用狄克斯特拉算法. 2. 原理 为了说明狄克斯特拉算法的原理,使用换钢琴的的例子来做说明. 假设R ...

  9. 狄克斯特拉算法(Dijkstra)详细解释

    文章目录 算法用途(目的) 算法思想与本质 图文解释 代码解析 算法用途(目的) 狄克斯特拉算法的用途或者说是目的是计算单源最短路径.单源最短路径的意思是从一个点出发到另外一个点最为的容易.举个例子解 ...

最新文章

  1. SharePoint 2013中的视频体验增强(1)——把大象装进冰箱
  2. 查看LINUX当前负载
  3. [Android]反编译apk + eclipse中调试smali
  4. 动态代理之Cglib浅析
  5. mysql不是内部或外部命令,也不是可运行的程序或批处理文件
  6. 怎么让背景铺满整个页面_PPT背景太单调,教你这3种实用的技巧!
  7. Atitit netcore 问题与解决 目录 1. 导入第三方dll库 1 1.1. 跨平台开发netcore程序 2 1.2. 不能生产dll问题,可能是360杀毒监控了。。 2 2. 运行dl
  8. 深度学习中Dropout原理解析
  9. 中国朝代历史,名字的简介
  10. win10下用VMware workstation pro安装Ubuntu 16.04图解
  11. XSS是什么?(Xmind配文详解)
  12. 百度 2021 Lic 机器阅读理解比赛有感
  13. 美学心得(第二百四十二集) 罗国正
  14. Google.com.hk 更名 Google 中国,谷歌已经不复存在?
  15. snap相关(个人总结)
  16. 工程师解读:为何华为手机“干不过”小米(1)
  17. 计算机工作站,大厂设计专用出差笔记本?戴尔3551+代图形设计工作站
  18. 51单片机真的过时了吗?单片机、ARM、DSP、FPGA/CPLD
  19. Nature:Hinton、LeCun、Bengio三巨头权威科普深度学习
  20. BUUCTF msic biubiu

热门文章

  1. 大白话讲解如何给github上项目贡献代码
  2. 【李宏毅2020 ML/DL】P80 Generative Adversarial Network | Feature Extraction
  3. express : 无法将“express”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。express: command not found
  4. CentOS 5/6下安装Axel插件加速yum下载
  5. windows连接mysql程序_windows 连接mysql
  6. 命名空间“System.Web”中不存在类型或命名空间名称“Optimization”解决方法
  7. mysql跳脱字符 单引号_MYSQL特殊字符(单引号,行尾斜杠)的处理
  8. linux内核 eql.c,Linux Kernel EQL_GETMASTRCFG请求内核信息泄露漏洞
  9. 安川变频器跳os_变频器常见故障代码及处理实例(经典,建议收藏)
  10. html云文件系统,一种HTML5云文件系统