QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1175

主题

4

听众

2848

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
- v$ |& e( y* Q( e4 [$ yclear all
4 F$ b0 B+ ^7 e- v' m: z4 y3 g%图论最短路问题的Dijkstra算法4 y1 O& m4 p4 s. T0 _+ ^0 x3 x
%邻接矩阵(点与点的关系)3 h/ t- O  N) R+ B$ F5 i$ V; T+ C
w=[0,2,4,inf,inf,inf,inf;  
3 N5 U$ R+ J$ o   2,0,inf,3,3,1,inf;
. K7 d, B- J  C- p3 w   4,inf,0,2,3,1,inf;                     
7 v" u$ y: n3 b8 ?   inf,3,2,0,inf,inf,1;                    
& @- H1 y2 v8 J1 u9 q+ D; W, h2 D   inf,3,3,inf,0,inf,3;
" o8 E7 C" |# c+ `, P0 L   inf,1,1,inf,inf,0,4;
0 V# L- j" u% G" H1 E  r4 Q2 l1 X   inf,inf,inf,1,3,4,0];0 F8 p4 C/ W* D& F) C/ e8 V) ^
n=size(w,1);%记录图中点数" [1 u6 Q. }) ~6 H' Y( g% g* Q
9 o* J. \$ U+ I7 v" R% O' \9 ^
for i=1:n
/ d! G% G- N' E3 V7 i0 v    l(i)=w(1,i); %为l(v)赋初值
0 J  l: z5 C) a6 r    z(i)=1;      %为z(v)赋初值1
/ m; p- \1 Z! B" N2 L& h6 |( Vend7 t: f3 P8 K* p& ^! s

; ~- s2 j: K$ h* B8 D2 Es=[];            %s集合
+ S: m* ]2 y- fs(1)=1;          %s集合的第1个元素为起点# ~, S+ K1 `) V5 _. a! I) }* c
u=s(1);
0 V+ \) W: x  R8 l, Wk=1;             %k记录集合s中点的数量
7 R6 o0 l5 J# ]6 R' @: F, W
) K5 w% X: c6 n9 j- K6 ?/ Iwhile k<n       %当集合s未包含所有元素的时候执行循环
8 Y0 s: c4 q* L# {3 m    for i=1:n    %更新一遍l(v),z(v)
3 k5 d4 o/ m% P9 k* p2 O8 Y4 v4 j        if l(i)>l(u)+w(u,i)3 ]# ?! u; D5 J4 Q
            l(i)=l(u)+w(u,i);1 j8 R  J/ H: W$ l. _
            z(i)=u;; p4 [: D5 p4 G+ C
        end2 t+ m3 z$ h0 X; N
    end
2 i$ a# \  H+ @# c* \/ e3 i5 E. t/ _6 A) d3 M
    %找l(i)中最小的v加入s集合* W. {' P0 c% F" x7 Q2 ]  j
    ll=l;
4 x8 j1 a1 K# Q, y    for i=1:n7 x: r( Y/ t4 {2 a3 [
        for j=1:k* B1 s  _  c0 A" n! [! z4 C5 J
            if i==s(j)
0 g4 H+ ^1 w0 b3 O+ Y; Y3 B                ll(i)=inf; %去除掉已经在s集合中的点
- T; G3 {: k1 m7 I' }2 w* a            end
( p- r! a/ M9 l) x, z& p2 i" b        end
, i/ v7 N" w; c" L6 |- ?7 b    end9 f+ j2 a9 y" a# v
    [lv,v]=min(ll); %求最小的l(v)( T6 U! z! F$ _5 A3 y. }
    s(k+1)=v;       %加入集合s
7 G( g. o* S* Z( o9 @    u=v;* m. a: D7 w* [0 ^7 D, c0 u
    k=k+1;
8 Y/ j% t7 K8 u" Qend
) E# z5 N% @# u6 x2 S3 F) g/ j3 K
: g$ F" N% B5 L2 F* S( x* p- yfprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)# w% Q2 g3 C3 m

( j+ Z& U1 Q3 \( t5 Z, M+ s解释:4 C3 E) z; Y, G6 l! [& J& g7 j
& h& a  T1 ~" ]# ^% Y7 o( t
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
" \' Y0 h0 n% b; A7 u: ^2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
8 V# u* v" M! q+ p/ E3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。0 s+ V, l' i, X& J2 v# U0 g$ ?! b
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。
0 z6 m5 \5 L# ^- i: A5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
8 p0 \) m# g( ?7 }! y
9 ]' ^/ R- \( C' o& t. y注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。, u9 j0 Z& o$ w# i4 z

/ L, u) G5 S+ c: ?- A/ W; Z( `6 d' v1 M3 L! \  J. K+ H

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, 2025-8-3 23:43 , Processed in 0.329767 second(s), 54 queries .

回顶部