QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
2 c. E% I0 Y) Nclear all
* `- b6 `/ D; s1 i- a% `7 }%图论最短路问题的Dijkstra算法* F7 d* O* S3 w4 ]3 x
%邻接矩阵(点与点的关系), r2 g8 s2 Z. _7 r( K! ]
w=[0,2,4,inf,inf,inf,inf;  5 H! d. }$ \2 g2 S) o) O
   2,0,inf,3,3,1,inf;
6 n$ T  G& N/ p$ v# s$ Y: S0 X   4,inf,0,2,3,1,inf;                      % ~; P# }+ ]( b* K
   inf,3,2,0,inf,inf,1;                    
3 |0 ]& P) i2 b  |; l/ Z, n7 p0 V8 n% s   inf,3,3,inf,0,inf,3;
0 A5 J0 h( u* S   inf,1,1,inf,inf,0,4;' d. ?. I& T* I& h- x$ Q
   inf,inf,inf,1,3,4,0];5 p. ?4 Q% f: A$ t+ _! E; v7 V8 j
n=size(w,1);%记录图中点数
# G. X% c; I1 g. O- c
- W5 m) D6 e3 B2 n7 _3 b/ }+ xfor i=1:n  H+ A. B+ z& ^. y
    l(i)=w(1,i); %为l(v)赋初值
# x' T3 c+ f, X8 e7 I0 y" h    z(i)=1;      %为z(v)赋初值1
3 f& z7 e" F. m  `; rend  G6 f& |1 b5 `, U2 i$ X
/ K1 r6 T7 S/ Y' A$ e6 a8 z
s=[];            %s集合
6 k( m# A. B& X& s3 h, b& }; l7 ms(1)=1;          %s集合的第1个元素为起点5 @+ k$ b( H+ W: ]( x0 s5 q9 I/ o
u=s(1);0 E, e% q0 f3 n& L9 V
k=1;             %k记录集合s中点的数量
5 p* `1 Y/ Z, }! U. p4 F
/ K' L5 P+ q; F- Pwhile k<n       %当集合s未包含所有元素的时候执行循环3 k& d0 d4 N( H# a' |
    for i=1:n    %更新一遍l(v),z(v)4 g+ z  }  d0 Q& j: r" H4 z  B. ?  I
        if l(i)>l(u)+w(u,i)
" X' {5 D, a$ x1 f3 I0 [: Q" f/ G# l4 G            l(i)=l(u)+w(u,i);" F! |4 N9 R1 ^4 B: b% p5 t& T4 i; h. |, u" n
            z(i)=u;
" O" j% g$ O8 _        end1 V* F! B, ]8 D% I) e4 d2 i$ M7 ~
    end
+ W1 {+ o! [! ~; m7 I
! N; p7 i; Q) s9 a    %找l(i)中最小的v加入s集合* L5 s. d9 _) }8 n1 i: r
    ll=l;4 t# h  R. r) Z& A0 G; d
    for i=1:n
9 F$ ~& b% ?. \( R2 ]0 Q2 ^# S        for j=1:k
! Q: E! ?. w4 H  s# W- h            if i==s(j)4 ^  \  v' x+ Y+ P' Z# L
                ll(i)=inf; %去除掉已经在s集合中的点8 C1 D6 k4 b3 b: J9 D
            end
+ f6 F) z/ @: v+ m( E( V+ p- C        end3 g; \# I3 b. s  K8 x0 y2 x) P
    end
: _& K! }, G. ^& }$ Y    [lv,v]=min(ll); %求最小的l(v)
: s! }; e$ Y7 \+ e    s(k+1)=v;       %加入集合s
) B/ s4 W. N' L    u=v;0 |/ b- t/ L- B9 g% y% P. K
    k=k+1;
% I( n, t6 V6 t* tend' |! T8 D- [' @" A. v& X

9 y7 X" a; d7 j+ r" Afprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)$ o% p9 M) Y: d' c0 O1 K, a9 d

+ E+ A) n+ ?0 _/ L解释:$ ^* D. p; m. X' E' u' a9 U
7 r( G3 D8 e8 @
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
4 }: w/ C2 t  B( `7 t2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。/ L) H7 F6 R! U: g6 w
3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。
, M/ \! w5 _" b4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。
- G% ?- ~! `( H. r5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
0 w, F  s  O2 z
" T) g0 k* _, g1 @注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
5 ]" U& |* U. d: u, Q+ y, o6 x# ?' F3 l3 d

$ n6 b4 a" t6 b1 e

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-6-16 11:24 , Processed in 0.353329 second(s), 55 queries .

回顶部