QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1176

主题

4

听众

2887

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
  |+ W+ S) N4 L) b2 Lclear all
. D: n" t* W2 h! q8 {; u%图论最短路问题的Dijkstra算法2 K6 ]: W' ]$ o7 t; w
%邻接矩阵(点与点的关系)
, h; r2 U4 S4 M1 sw=[0,2,4,inf,inf,inf,inf;  % H. a: B) {! i) \+ ~3 D
   2,0,inf,3,3,1,inf;, x. Y6 ?& r: i5 }- n
   4,inf,0,2,3,1,inf;                     
4 t8 L; z# }& l( V1 }   inf,3,2,0,inf,inf,1;                    
) ]/ @) v3 b1 A0 Z$ v1 W2 H   inf,3,3,inf,0,inf,3;6 Q6 x  B7 V5 X9 h0 N' ]0 [
   inf,1,1,inf,inf,0,4;
/ f$ o" {$ ]9 i/ Z- L' L% B- o   inf,inf,inf,1,3,4,0];) @, d8 G  v" t$ ]+ |. `2 p% n7 N1 q
n=size(w,1);%记录图中点数
4 G9 d) ~$ j( e, Y3 g
  W  a3 E+ Q6 s. N/ Q9 D$ jfor i=1:n
& g8 C, {0 B* U% m    l(i)=w(1,i); %为l(v)赋初值$ r& |  e" E6 B% b- }9 ^' u7 e
    z(i)=1;      %为z(v)赋初值1
( S: w& L+ _2 _( Y- h1 Fend
3 z. Y  R; f8 E6 H) @" t5 J. d. i/ {$ L
s=[];            %s集合
1 I  K: y$ A! V. \2 _s(1)=1;          %s集合的第1个元素为起点
/ c) W# u1 a7 L' v! S( h* C: N1 C3 V8 au=s(1);
& ]" z4 k6 t- O; Z/ @k=1;             %k记录集合s中点的数量% o) u2 a/ m  v( ~+ |6 |

! T* L- b9 U2 n4 q  T! nwhile k<n       %当集合s未包含所有元素的时候执行循环
6 @; o: g2 h; W2 n  a  b    for i=1:n    %更新一遍l(v),z(v)
9 |0 @7 x6 y6 m# A% ^        if l(i)>l(u)+w(u,i)
2 m0 X4 {# r% v2 y            l(i)=l(u)+w(u,i);/ t+ A3 z/ d: ^/ H: X
            z(i)=u;
0 i; g- T% ~6 t& f( X; j        end
6 J; c& W* n0 U$ ]    end) i6 I! [" C1 X- d1 e" O3 o
' [- |- f: d; ~' w3 _
    %找l(i)中最小的v加入s集合
' w+ U+ M2 m2 d2 s    ll=l;
2 a7 b  C- f0 I: j+ [    for i=1:n$ M+ I4 N4 v0 |; H8 D
        for j=1:k
& U: V/ [+ \$ w3 G8 H$ h# E( O            if i==s(j). e0 Y3 B0 n: u/ S$ X, Z& {0 W6 A
                ll(i)=inf; %去除掉已经在s集合中的点
/ _6 k( v3 m  a/ w8 i% {            end $ Y/ T: w* H5 v9 k& z8 q& L4 B
        end  C' _% E2 x* r  ^0 {) Q
    end# V# b* H& R. m' Z- q$ i
    [lv,v]=min(ll); %求最小的l(v)
+ i9 x$ z4 a; [5 t# Y6 w( Q/ T: M) L4 q    s(k+1)=v;       %加入集合s
2 E9 w( [! I/ O) d+ a# X7 u    u=v;
2 S% E2 b7 I% }; g6 |9 m    k=k+1;
( ]" i$ q* e3 t5 x3 d+ kend4 y, A7 H6 r. G% r( \; [$ e: g

3 V- F) w* n/ J3 `* |. c+ E/ Y5 Sfprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
: j  ]. q& B. w0 o# e+ H' V" U- ^8 a$ ^4 l3 s
解释:
* W% e2 o* r+ J7 ]* u8 h9 V4 `- t% q" u9 @( a# {
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
# l/ o. y, p' `& d( C/ ?- w2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
9 H( V, {, U8 N1 P3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。, Q) h9 ?; K, O  W
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。2 k! j" v- O' x6 k( o* b" l4 I
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
& h; o, s' s1 L2 X5 _
! g, R+ |; m6 u4 q* H注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。3 d+ O6 H9 [: C  d3 ]
: d7 J' A; ~5 y9 T0 e0 f% Y" j4 w
  O. P; d3 h. D; F7 M- X  m; ^: U

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-11-3 19:28 , Processed in 0.319239 second(s), 54 queries .

回顶部