QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
# o% U- P7 q4 ?+ Iclear all
! \7 t$ y3 |/ v7 |& F! e& B%图论最短路问题的Dijkstra算法
. ?+ R/ X1 r  |  r/ F  P8 B* H%邻接矩阵(点与点的关系)
; A  i* p5 e- {* H- Aw=[0,2,4,inf,inf,inf,inf;  7 P4 l" ?- X9 o: A2 E4 |# s
   2,0,inf,3,3,1,inf;: R8 h% z! H7 r
   4,inf,0,2,3,1,inf;                     
3 e( Z: N; ]$ j, f   inf,3,2,0,inf,inf,1;                    & N( B8 C7 E9 O/ v: X4 f! G
   inf,3,3,inf,0,inf,3;
7 p* D5 S1 [5 w6 o  _, o, _4 X   inf,1,1,inf,inf,0,4;8 k# D: |4 v2 H7 U; M- O
   inf,inf,inf,1,3,4,0];
$ K- F( h/ k# D$ G3 Cn=size(w,1);%记录图中点数
7 j' q) l, J& s9 T" b. }
4 N3 n/ t: f- b8 U! Zfor i=1:n9 P# ~) K5 L- K" ~
    l(i)=w(1,i); %为l(v)赋初值
/ L: h- R7 d7 T9 L+ u' r    z(i)=1;      %为z(v)赋初值1
6 E1 D6 w0 V3 J% a; _3 jend8 ~& r. ~; L. n- b
, f: q  I5 E  B$ x9 q* N
s=[];            %s集合
6 d( @3 F8 D0 l3 P6 es(1)=1;          %s集合的第1个元素为起点
4 ?( p% [  a2 v6 T% ]  iu=s(1);
  p- H6 `% M) r7 b7 Q" Ik=1;             %k记录集合s中点的数量% r3 M$ q8 V; W2 W& z# u

& U! \/ y4 Q+ \( uwhile k<n       %当集合s未包含所有元素的时候执行循环- P/ P/ r  \% t4 s
    for i=1:n    %更新一遍l(v),z(v)
( b6 h. S- O, L  E) _  w        if l(i)>l(u)+w(u,i)
: e) Z2 V$ P( H: y8 z" m& L            l(i)=l(u)+w(u,i);( H, D: v4 V' H2 E! V/ ^
            z(i)=u;: h4 Y* x; ^8 S7 G4 O7 v; V3 F! d2 G
        end7 f) Y' O: \" C
    end
: U, s/ W* L$ `/ M
" p6 T2 v+ ]8 n3 k7 O; B% T    %找l(i)中最小的v加入s集合' j6 Q  `( D6 K9 U) |
    ll=l;
2 e5 q0 O7 ^* r3 T" S; k    for i=1:n' r) k) j  Q% w) `3 `; g  k+ |, m
        for j=1:k
$ J8 F8 S3 b" x* s1 d! L4 T; R            if i==s(j), Z8 i/ Z# m8 r5 e3 q
                ll(i)=inf; %去除掉已经在s集合中的点2 I+ }) J* x4 ~3 n9 ^
            end $ {) u3 O, `3 O% C$ g
        end# e" @% o% q9 h7 N) I8 `7 T: l2 A. ?6 W
    end% q: M% `; P. S) L; j9 Z9 @3 p
    [lv,v]=min(ll); %求最小的l(v)
2 c. V7 U. Q+ E! R# W) ~    s(k+1)=v;       %加入集合s8 a! y8 l+ f9 S: X5 A7 o) p
    u=v;5 ]/ j4 F: C$ V
    k=k+1;
; E) |2 x* y3 u+ xend0 M; ]" e# |& t) c% |% v

) Z& v" e( `$ z' ?3 Q" ]fprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
+ h& k9 Z( v% N; m" d  Y
( `" T5 U* C! y5 Y! i解释:
) I: H0 H0 e6 x
% \( B4 O# X, o8 K) ^1 G2 _! H- e1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
. s2 M/ [* N& [2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
) B, k+ ?) ]' ^) P( Y: S. M/ j3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。
1 u* T0 n) C0 i2 J$ o4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。& |# v/ r: m1 W+ p8 f
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
$ \3 c# m- E" s* C( Z' t6 o5 C5 @
( Z6 c( n5 J" I. i注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
' @' d# q0 o& ~3 U6 m" h5 U  l$ \/ K* h5 Y0 e5 \2 o3 Q; D
* g0 Z* `# i$ I( M* E, m; \! r

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-7-10 14:52 , Processed in 0.310420 second(s), 55 queries .

回顶部