QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 322|回复: 0
打印 上一主题 下一主题

图中最短路径解决方法 Dijkstra

[复制链接]
字体大小: 正常 放大

778

主题

1

听众

1957

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:0 ^" [. Z5 x; I3 i
clear all" L* C+ ]8 b5 o. m, k+ l7 O7 A
%图论最短路问题的Dijkstra算法
! y0 N9 ?" M' P( C%邻接矩阵(点与点的关系)4 h% q9 N3 B! j1 R
w=[0,2,4,inf,inf,inf,inf;  
! `0 x& y, q, S1 ?: F, x  u   2,0,inf,3,3,1,inf;5 ?; x* x5 g5 p
   4,inf,0,2,3,1,inf;                     
7 `9 k5 L9 f0 ~   inf,3,2,0,inf,inf,1;                    
  z" e1 w1 M4 Z5 t   inf,3,3,inf,0,inf,3;  d8 ?: i. a2 [3 {
   inf,1,1,inf,inf,0,4;0 f6 @7 h6 g; C
   inf,inf,inf,1,3,4,0];7 u* Z: G4 _: `3 u' _
n=size(w,1);%记录图中点数
& U1 D- e. F: l* o( U5 |0 f' X  \( O3 F3 Z, I  I1 F
for i=1:n
; |. x. n/ y& v  C    l(i)=w(1,i); %为l(v)赋初值. u7 g: R2 w2 N' e
    z(i)=1;      %为z(v)赋初值1
& }* W, n5 A2 _! A8 m. f$ x6 e7 G: oend
+ n7 W  p. A; a" f# i% }/ \2 q% I/ W( c6 n- p2 |
s=[];            %s集合9 r1 J/ Y" U- W2 u6 Q& T6 ^5 {
s(1)=1;          %s集合的第1个元素为起点5 L5 ]3 r7 b2 t2 o, O, t/ f
u=s(1);# p* Z0 N7 S9 Z
k=1;             %k记录集合s中点的数量: A8 g+ v" a) p9 M, }) m
6 y9 _% g5 z7 w( F/ S7 r; y! a. ^
while k<n       %当集合s未包含所有元素的时候执行循环& W' ~! }' Z9 h1 N" ^- @1 x
    for i=1:n    %更新一遍l(v),z(v)& E/ n3 N7 |  M1 z
        if l(i)>l(u)+w(u,i)" m: m5 ^5 J$ E, v9 c( O, b
            l(i)=l(u)+w(u,i);; I  R/ W- H7 Q% }" H8 C9 T$ o
            z(i)=u;
- E0 |2 r2 |$ O  P3 ]* c        end
4 i) r$ r1 \4 G, \* K7 T) _$ g' K    end
- t7 _# I* [/ [5 _
( V9 [; _& i) U: o; C  Q5 o    %找l(i)中最小的v加入s集合
! S0 H  Y& g$ {) V1 u9 F7 d    ll=l;! f; B. q2 a: K
    for i=1:n+ K/ h6 l3 E+ Z3 T  D
        for j=1:k
4 e& F' X7 @& y' G8 E            if i==s(j)* g1 s& A( p' t% V; f6 l; u- f
                ll(i)=inf; %去除掉已经在s集合中的点
! ~- X" c4 n4 J  r0 b            end
; I1 E) S- N2 @/ |6 A: a5 c        end( N, M7 L2 f* }9 J4 `0 B
    end
2 S: \# ~4 J* g0 J( K$ |- V    [lv,v]=min(ll); %求最小的l(v)3 J( I! M5 \7 o0 t+ ^
    s(k+1)=v;       %加入集合s
# H: n& _0 M! J# G- ~  X/ j/ _    u=v;, @4 g- M4 w8 l( z3 _( r  q
    k=k+1;) F2 @! ?; n7 c" R) Z9 d, g% x% u
end; \+ _$ d- J! D- _' t# f

6 F2 `2 k) w. Hfprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)* y# U+ H: V/ z: p
8 i! s( {- T! @5 V7 f' v. I
解释:( |& A2 R! R; X6 ~' L9 k$ n3 i3 F/ M
1 `% Z  [. [7 x- x6 w4 ]
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。( Z0 J; j; q  ]! T7 j- X; ]2 Z1 |  ?
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。! k) S1 M9 T: @! D: D
3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。+ y. |, G" N# O% I& z- `
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。, R$ p7 ]" y' s8 e5 h
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
1 L- c* g9 r, h. i% a
" ]1 R5 y8 g0 {$ h3 e% B/ W" g注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
( Z* m5 Q) T+ y' l9 Q% }
) W8 X$ Y9 ]; y# M7 S  b
( }9 N: Y* I0 y5 X1 O

Dijkstra.m

913 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 1 点体力  [记录]  [购买]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2024-4-29 05:29 , Processed in 0.289483 second(s), 54 queries .

回顶部