QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:3 r* o1 n" A! ]; {) X9 o
clear all& J1 }  O6 ]/ K
%图论最短路问题的Dijkstra算法
* I; p8 e. C. _; ~) x%邻接矩阵(点与点的关系)
7 i8 W3 e& P& V+ _, pw=[0,2,4,inf,inf,inf,inf;  
- _: H6 f% b; r2 P4 _1 U/ H6 r   2,0,inf,3,3,1,inf;7 z' |4 R) z: k- h$ U) N1 ~
   4,inf,0,2,3,1,inf;                      . l  G! g3 U3 ?1 d; x7 Q
   inf,3,2,0,inf,inf,1;                    1 |1 T$ F6 j0 J
   inf,3,3,inf,0,inf,3;
  j. }4 ?+ G. E) W( I9 F' \   inf,1,1,inf,inf,0,4;
: w9 h% V+ x5 @" v4 S   inf,inf,inf,1,3,4,0];
* x1 z4 V( e1 cn=size(w,1);%记录图中点数
; p8 n5 I4 ?8 g8 l/ K; t$ c0 @8 m/ {! d- a- C: r
for i=1:n- t! ?# A4 n# u
    l(i)=w(1,i); %为l(v)赋初值- @' X8 U# p5 A" N+ Q' P
    z(i)=1;      %为z(v)赋初值1
$ [/ ^) b  S2 L& g% wend6 J* G: q% [2 I6 P' d% p+ z

% W# ]( {9 M' vs=[];            %s集合1 a; Q: F$ p( I. ?+ ]5 i  d
s(1)=1;          %s集合的第1个元素为起点
' r9 a# g2 D  H) x. yu=s(1);, G& G/ \3 r4 ~3 c2 y- \/ a
k=1;             %k记录集合s中点的数量/ N* w" v8 q6 H3 y

( ~! y4 a# M2 {; r4 n% p% {0 Twhile k<n       %当集合s未包含所有元素的时候执行循环
$ O$ K+ s: E7 v" ~2 I/ R$ h+ i2 S    for i=1:n    %更新一遍l(v),z(v)
8 Y! r# m/ f* f& q& c        if l(i)>l(u)+w(u,i)% T0 `1 F$ r; F9 J* l
            l(i)=l(u)+w(u,i);& v! C+ s" n/ c2 N; o9 ~
            z(i)=u;, t1 N: B% S2 B
        end9 O" x% S3 u2 ~" k* _6 f
    end
, G& S& y1 w' p
- J; ?8 @3 x2 u+ S/ ^3 Q/ M3 v    %找l(i)中最小的v加入s集合
# E9 T: g( N4 X' U- X; R' a% Q    ll=l;) u; c/ B+ S) V8 t- @; ^. L
    for i=1:n' U' y" u0 ~& i
        for j=1:k, D! ~5 s. N4 q
            if i==s(j)
+ C+ V. v& D7 Q( L                ll(i)=inf; %去除掉已经在s集合中的点
& `- l! F, A. p% p            end
6 a/ U8 Z+ H' k$ c% F* H6 C        end( b0 \/ ?9 T. P  C" z" R
    end
' R% Y2 Q2 H* t' e) T$ H+ d    [lv,v]=min(ll); %求最小的l(v)
7 _1 ~$ r! I  |# {8 d$ K1 X    s(k+1)=v;       %加入集合s! e: j/ B! \6 o7 D" c
    u=v;- y* ?% a2 C4 p/ g
    k=k+1;
% l( o  L; g/ r6 ?end
; x. R, a2 t; \. t2 n% Z! i/ [( m4 y2 [2 q5 F1 a* Y7 F
fprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)  [$ r0 Q3 U& q% s
6 F8 N( k2 S  _
解释:, u. ]$ w$ C  N! d, I1 o
/ P4 c  h& ^  X0 k0 H
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。. q' x7 ?1 O# ?3 y2 g7 {' J
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。6 o8 M" G) R. `' `. j
3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。
, x5 ^; I6 W" d# l% {& p4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。; l% _- ~; X' u& ~% j: |
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。& P5 I( [, X3 k* Y" _& x# B% {2 N* h. R/ n

) b3 H: f. T) I0 @注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
! K# q( J& b  y% X% I5 F& p5 O
- `3 K0 n3 s9 v  C+ |- ?: U0 O0 o0 _* c1 e6 o1 g( ]9 g

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, 2026-4-20 22:16 , Processed in 0.461664 second(s), 55 queries .

回顶部