最短路算法之Dijkstra算法通俗解释
Dijkstra算法
说明:求解从起点到任意点的最短距离,注意该算法应用于没有负边的图。
来,看图。

用邻接矩阵表示
int[][] m = {
{0, 0, 0, 0, 0, 0},
{0, 0, 4, 2, 0, 0},
{0, 0, 0, 3, 2, 3},
{0, 0, 1, 0, 4, 5},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0}};
备注:第一行(从第零行开始)表示A,第一列(从第零列开始)表示A。m[1][2]表示A到B的距离,如果没有相连则赋值为0。
首先用dist[i]数组表示从起点到该点的距离,比如dist[3]表示起点A到点C的距离。先全部初始化为无穷大,把起点初始化为0,因为自己到自己距离为0。接下来把所有的点的距离放入一个优先队列。步骤:
遍历直到队列为空:
在优先队列中删除值(dist[i])最小的点,不过记得保存下来,然后看与其相邻的点的距离,如果相邻的点的距离大于该点距离加上该点到相邻点的距离,则改变相邻的点的距离为该点距离加上该点到相邻点的距离,在优先队列中改变这个相邻的点的距离就好了。
解释:就是宽度优先搜索的变形,宽度优先搜索是直接从队列取出来就好了,没有优先顺序,而这个是根据该点的距离值(就是从起点到该点的距离)来确定优先出队顺序。
在这里优先队列实现的方案有四种:数组,二分堆,d堆,Fibonacci堆。复杂度可以自己去分析一下。提示:你可以计算从队列中删除和加入,复杂度分别是多少,就很容易算出来了。在这里说下数组的吧,从数组中删除最小的:o(V),插入:o(1),总:o(v^2)
来,看下我的代码实现。我是用的map,复杂度与数组实现类似。
import java.util.*;
public class Main {
public static int deleteMin(Map<Integer, Integer> map) {
int min = Integer.MAX_VALUE;
for (int num : map.values()) {
min = Math.min(min, num);
}
int u = 0;
for (int num : map.keySet()) {
if (map.get(num) == min) {
u = num;
break;
}
}
map.remove(u);
return u;
}
public static void dijkstra(int[][] m) {
int n = m.length;
int[] dist = new int[n + 1];
int[] pre = new int[n + 1];
for (int i = 0; i < n; i++) dist[i] = Integer.MAX_VALUE;
dist[1] = 0;
pre[1] = 1;
//点与距离
Map<Integer, Integer> map = new HashMap<>();
for (int i = 1; i < n; i++) {
map.put(i, dist[i]);
}
while (!map.isEmpty()) {
int u = deleteMin(map);
for (int i = 1; i < n; i++) {
if (m[u][i] > 0) {
if (dist[i] > dist[u] + m[u][i]) {
dist[i] = dist[u] + m[u][i];
pre[i] = u;
map.put(i, dist[i]);
}
}
}
}
for (int i = 1; i < n; i++) {
System.out.println("节点1离节点" + i + "距离是:" + dist[i] + ",节点" + i +"的父节点是;" + pre[i]);
}
}
public static void main(String[] args) {
int[][] m = {
{0, 0, 0, 0, 0, 0},
{0, 0, 4, 2, 0, 0},
{0, 0, 0, 3, 2, 3},
{0, 0, 1, 0, 4, 5},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0}};
dijkstra(m);
}
}
最短路算法之Dijkstra算法通俗解释的更多相关文章
- 【hdu 2544最短路】【Dijkstra算法模板题】
Dijkstra算法 分析 Dijkstra算法适用于边权为正的情况.它可用于计算正权图上的单源最短路( Single-Source Shortest Paths, SSSP) , 即从单个源点出发, ...
- 最短路径算法(Dijkstra算法、Floyd-Warshall算法)
最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- 算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
一.名称 动态规划法应用 二.目的 1.贪婪技术的基本思想: 2.学会运用贪婪技术解决实际设计应用中碰到的问题. 三.要求 1.实现基于贪婪技术思想的Prim算法: 2.实现基于贪婪技术思想的Dijk ...
- 最短路算法之 Dijkstra算法
Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其它全部节点的最短路径. 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最 ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
- 最短路经算法简介(Dijkstra算法,A*算法,D*算法)
据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探路,交通路线导航,人工智能,游戏设计等等.美国火星探测器核心的寻路算法就是采用的D*(D Star)算法. 最短路经计算分静态 ...
- 最短路径算法 2.Dijkstra算法
Dijkstra 算法解决的是带权重的有向图上单源最短路径问题,该算法要求所有边的权重都为非负值.该算法的时间复杂度是O(N2),相比于处理无负权的图时,比Bellmad-Ford算法效率更高. 算法 ...
- 非负权值有向图上的单源最短路径算法之Dijkstra算法
问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...
随机推荐
- js 时间字符串转化为时间
对于时间字符串格式为:"2017-03-03 12:23:55"; IE:显示无效的日期 new Date("2017-03-3 12:23:55") //[d ...
- TestNG并行测试
并行(多线程)技术在软件术语里被定义为软件.操作系统或者程序可以并行地执行另外一段程序中多个部分或者子组件的能力.TestNG允许我们以并行(多线程)的方式来执行测试.这就意味着基于TestNG测试组 ...
- Easy UI下拉列表默认选中(多行)与为文本框赋值
1.为单行文本框赋值 var data2 = $('#LoadArea').combobox("getData"); if (data2) { $('#id).combobox(' ...
- 轻松驾驭Tomcat
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...
- 网站出现service unavailable的解决方法
特别提示:本文的教程仅适合采用windows服务器的IIS组件上操作,service unavailable是许多网站会经常遇到的问题,希望对大家有用. 昨天一小段时间网站出现了service una ...
- android wear开发之:增加可穿戴设备功能到通知中 - Adding Wearable Features to Notifications
注:本文内容来自:https://developer.android.com/training/wearables/notifications/index.html 翻译水平有限,如有疏漏,欢迎批评指 ...
- TFS在项目中DevOps落地进程(下)
紧接上篇 TFS在项目中Devops落地进程(上) 再接着说TFS相关之前先插入一个番外篇,虽然跟TFS关系不大但跟DevOps关系很大,觉得有必要在此乱入一下. 番外篇--监控之Applicatio ...
- Java 面试题:百度前200页都在这里了
基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie ...
- web前端-----JAVA Script(一)
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase ...
- short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确。为何?
如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确.这两个表达式都被称为赋值表达式.第二个表达式使用的是简单赋值操作符(=),而第一个表达式使用的是复合赋值操作符. ...