【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现

代码来源:《图论算法及其matlab实现》(北京航空航天出版社)

P18

书中提出了基于经典Dijkstra算法改进的两种算法。

其中算法Ⅱ的效率较高。

代码如下:

 1 function a=Dijk(a)
 2 %a(输入量)表示图的邻接矩阵
 3 %a(输出量)表示所求最短路径的距离矩阵
 4
 5 %建立邻接矩阵,若不还是对称矩阵,则变为对称矩阵
 6 n=length(a);
 7 for i=2:n
 8     for j=1:(i-1)
 9         a(i,j)=a(j,i);
10     end
11 end
12
13 %The main program
14
15 %步骤2.1
16 for k=1:(n-1)
17     b=[1:(k-1),(k+1):n];
18     kk=length(b);
19     a_id=k;
20     b1=(k+1):n;
21     kk1=length(b1);
22     %步骤2.2.1
23     while kk>0
24         for j=1:kk1
25             te=a(k,a_id)+a(a_id,b1(j));
26             if te<a(k,b1(j))
27                 a(k,b1(j))=te;
28             end
29         end
30
31         miid=1;
32
33
34         for j=2:kk
35             if a(k,b(j))<a(k,b(miid))
36                 miid=j;
37             end
38         end
39
40         a_id=b(miid);
41         b=[b(1:(miid-1)),b((miid+1):kk)];
42         kk=length(b);
43         if a_id>k
44             miid1=find(b1==a_id);
45             b1=[b1(1:(miid1-1)),b1((miid1+1):kk1)];
46             kk1=length(b1);
47     end
48 end
49
50
51 for j=(k+1):n
52     a(j,k)=a(k,j);
53 end
54 end

验证:

n=12;
a=ones(n)+inf;
for i=1:n
a(i,i)=0;
end
a(1,2)=5;
a(2,3)=8;
a(2,6)=5;
a(3,4)=3;
a(3,9)=10;
a(4,5)=5;
a(4,7)=3;
a(5,6)=2;
a(7,8)=2;
a(8,9)=4;
a(8,11)=6;
a(9,10)=3;
a(10,11)=5;
a(10,12)=3;
Dijk(a)

运行结果如下:

ans =

     0     5    13    16    12    10    19    21    23    26    27    29
     5     0     8    11     7     5    14    16    18    21    22    24
    13     8     0     3     8    10     6     8    10    13    14    16
    16    11     3     0     5     7     3     5     9    12    11    15
    12     7     8     5     0     2     8    10    14    17    16    20
    10     5    10     7     2     0    10    12    16    19    18    22
    19    14     6     3     8    10     0     2     6     9     8    12
    21    16     8     5    10    12     2     0     4     7     6    10
    23    18    10     9    14    16     6     4     0     3     8     6
    26    21    13    12    17    19     9     7     3     0     5     3
    27    22    14    11    16    18     8     6     8     5     0     8
    29    24    16    15    20    22    12    10     6     3     8     0
时间: 2024-12-04 11:06:15

【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现的相关文章

【最短路】求两点间最短路的Floyd算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P22 此代码返回第一个点和最后一个点之间最短路径,以及最短路径的长度. 代码如下: 1 function [P,u ] = Floyd(W) 2 %W表示权值矩阵 3 %P表示最短路径 4 %u表示最短路的权和 5 n=length(W); 6 U=W; 7 m=1; 8 9 while m<=n %判断是否满足停止条件 10 for i=1:n 11 for j=1:n 12 if U(i,j)>U(i,m)+U

求两点之间最短路径-Dijkstra算法

 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算

bzoj 2125 最短路——仙人掌两点间最短路

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 因为看了TJ又抄了标程,现在感觉还是轻飘飘的--必须再做一遍. 两点间的情况: 1.直到 lca 都没有在一个环上的部分: 2.本来就处在一个环上: 3.本来不在一个环上,快到 lca 的时候开始处在一个环上了. 第一种情况就普通弄就行.处理倍增 lca 数组和根到每个点的最短路dis值. 第二种情况在环上两部分取较短的就行. 第三种情况是前两种的结合.需要找到 p 和 q 刚开始在

最短路径(图中两点间最短路径)

求解城市之间的最短距离是一个非常实际的问题,其大意如下: 某地区由n个城市,如何选择路线使某个城市到某个指定城市的的距离最短? 注意:这里需要求解的最短路径指的是两个城市之间的最短距离,而不是所有城市之间最短总距离. 1.最短路径算法 //最短路径算法 static void distMin(GraphMatrix GM,int vend){ //vend为结束点 int[] weight=new int[GraphMatrix.MaxNum]; //某终止点到各顶点的最短路径长度 int i,

求两点间的距离

//P60   2.6 import java.util.Scanner; public class Demo_1{ public static void main(String[] agrs) { Scanner input = new Scanner(System.in); System.out.("Enter a number 0 and 1000: "); int number = input.nextInt(); int a = number%10; int b = numb

基于pgrouting的任意两点间的最短路径查询函数二

在前面的博文中写过一篇查询任意两点间最短路径的函数,当时对pgrouting不熟悉,功能很low.现在对该函数进行扩展,支持用户自己输入查询的数据库表,这一点看似简单,其实意义很大,在做室内导航的时候当用户所在的楼层变化的时候最短路径函数查询的数据表名称也会发生变化,不可能一栋大楼里的道路都是一样的吧,另外进行跨楼层的最短路径规划时,需要查询从A到楼梯口的最短路径和楼梯口到B的最短路径,这些都需要进行最短路径规划的时候能够自己选择数据表. DROP FUNCTION pgr_fromAtoB(t

两点之间最短路径:弗洛伊德算法

弗洛伊德算法是计算无向有权图中两点间最短路径的算法,复杂度为O(n^3).其思路是将两点间距离分为过(指定的)第三点或是不过,然后取它们的最小值,如此循环就可以得到两点之间真正的最小值. void floyd() { for (int k = 0; k < n; ++k) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { //在当前i到j经过k点的路径与直连的路径中选最短 matrix[i][j] = min(ma

两点间所有路径的遍历算法

转自:http://blog.sina.com.cn/s/blog_5ff8e88e01013lot.html 这几天,用到了这个功能,但在网上找到了一份资料,思路写的很清晰,但代码有错误.因此,我就按着这个思路,自己整理了代码,现在说明如下:(引用前部分思想,更新后部分代码) 两点间所有路径的遍历算法 中国海洋大学 信息科学与工程学院 熊建设 梁磊 摘要:本文首先简单介绍图的深度优先遍历算法,接着根据图的深度优先遍历算法求出连通图中两点间所有路径,并给出代码. 关键词:图.深度优先遍历.算法

寻找两点间的最短距离

由于项目的需要,需要作出计算两点间的最短行走路径的算法  来来回回弄了几天  总算做出来了 参考:http://www.cnblogs.com/hanchan/archive/2009/09/23/1572509.html using UnityEngine; using System.Collections; using System.Collections.Generic; public class DijkstraDouble : MonoBehaviour { // Use this f