Dijkstra算法求最短路径 Java实现
基本原理:
迪杰斯特拉算法是一种贪心算法。
首先建立一个集合,初始化只有一个顶点。每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路径距离(比较在集合内源点到达目标点中各个路径的距离,取最小值),以此类推,直到将所有点都加入集合中。得到的就是源点到达各顶点最短距离。时间复杂度为 O(n^2)。
变量解释:
1、采用图的邻接矩阵存储结构;
2、辅助数组visited[n] :表示当前顶点的最短路径是否求出,1表示求出;
3、辅助数组path[n] :记录路径,字符串类型;
4、返回结果shortPath[n]
算法代码:
- public class Dijkstra {
- public static final int M = 10000; // 代表正无穷
- //案例演示
- public static void main(String[] args) {
- // 二维数组每一行分别是 A、B、C、D、E 各点到其余点的距离,
- // A -> A 距离为0, 常量M 为正无穷
- int[][] weight1 = {
- {0,4,M,2,M},
- {4,0,4,1,M},
- {M,4,0,1,3},
- {2,1,1,0,7},
- {M,M,3,7,0}
- };
- int start = 0;
- int[] shortPath = dijkstra(weight1, start);
- for (int i = 0; i < shortPath.length; i++)
- System.out.println("从" + start + "出发到" + i + "的最短距离为:" + shortPath[i]);
- }
- public static int[] dijkstra(int[][] weight, int start) {
- // 接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中)
- // 返回一个int[] 数组,表示从start到它的最短路径长度
- int n = weight.length; // 顶点个数
- int[] shortPath = new int[n]; // 保存start到其他各点的最短路径
- String[] path = new String[n]; // 保存start到其他各点最短路径的字符串表示
- for (int i = 0; i < n; i++)
- path[i] = new String(start + "-->" + i);
- int[] visited = new int[n]; // 标记当前该顶点的最短路径是否已经求出,1表示已求出
- // 初始化,第一个顶点已经求出
- shortPath[start] = 0;
- visited[start] = 1;
- for (int count = 1; count < n; count++) { // 要加入n-1个顶点
- int k = -1; // 选出一个距离初始顶点start最近的未标记顶点
- int dmin = Integer.MAX_VALUE;
- for (int i = 0; i < n; i++) {
- if (visited[i] == 0 && weight[start][i] < dmin) {
- dmin = weight[start][i];
- k = i;
- }
- }
- // 将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin
- shortPath[k] = dmin;
- visited[k] = 1;
- // 以k为中间点,修正从start到未访问各点的距离
- for (int i = 0; i < n; i++) {
- //如果 '起始点到当前点距离' + '当前点到某点距离' < '起始点到某点距离', 则更新
- if (visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]) {
- weight[start][i] = weight[start][k] + weight[k][i];
- path[i] = path[k] + "-->" + i;
- }
- }
- }
- for (int i = 0; i < n; i++) {
- System.out.println("从" + start + "出发到" + i + "的最短路径为:" + path[i]);
- }
- System.out.println("=====================================");
- return shortPath;
- }
- }
Dijkstra算法求最短路径 Java实现的更多相关文章
- Dijkstra算法求最短路径(java)(转)
原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...
- _DataStructure_C_Impl:Dijkstra算法求最短路径
// _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- 通俗易懂理解——dijkstra算法求最短路径
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止 ###基本思想 通过Dij ...
- Java实现Dijkstra算法求最短路径
任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层 ...
- Dijkstra算法求最短路径
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h&g ...
- Dijkstra算法求单源最短路径
Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...
- js迪杰斯特拉算法求最短路径
1.后台生成矩阵 名词解释和下图参考:https://blog.csdn.net/csdnxcn/article/details/80057574 double[,] arr = new double ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
随机推荐
- TypeScript 解构和展开
解构数组 解构数组元素 let input = [1, 2]; let [first, second] = input; console.log(first,second); 交换值 [first, ...
- 【LG3322】[SDOI2015]排序
[LG3322][SDOI2015]排序 题面 洛谷 题解 交换顺序显然不影响答案,所以每种本质不同的方案就给答案贡献次数的阶乘. 从小往大的交换每次至多\(4\)中决策,复杂度\(O(4^n)\). ...
- QT QWidget 关闭的流程
当QWidget被点击右上角“X”关闭时: 1.调用虚函数closeEvent 2.调用QWidget的析构函数
- IOCP另一种实现
参考 https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-bindiocompletioncallback ht ...
- Golang微服务实践
背景 在之前的文章<漫谈微服务>我已经简单的介绍过微服务,微服务特性是轻量级跨平台和跨语言的服务,也列举了比较了集中微服务通信的手段的利弊,本文将通过RPC通信的方式实现一个增删查Redi ...
- 【操作系统之五】Linux常用命令之grep
一.概念grep(Global search Regular Expression and Print out the line)强大的文本搜索工具,从文本文件或管道数据流中筛选匹配的行及数据,并把匹 ...
- ASP.NET Core使用Docker-Compose实现多容器应用部署
一.需求背景 人生苦短,我用.NET Core!前面的<ASP.NET Core使用Docker进行容器化托管和部署>基础课程我们学习了如何使用Docker来部署搭建ASP.NET Cor ...
- 关于liveness服务依赖用法整理
一.生产环境中部分服务的使用场景有前置条件 使用initContainers,做一些前置服务的检测动作,以确定前置服务已正常运行且能对外提供服务(若检测未通过则本pod无法启动) 使用liveness ...
- 前端与算法 leetcode 36. 有效的数独
目录 # 前端与算法 leetcode 36. 有效的数独 题目描述 概要 提示 解析 算法 传入[['5', '3', '.', '.', '7', '.', '.', '.', '.'],['6' ...
- xunsearch安装
1.下载 sudo wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 2.解压 sudo tar -xvjf x ...