QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
! P  D) _1 r  U5 d5 ?# a' ^3 g" `clear all
' R+ P& f" D- P' R) R, I/ a# O%图论最短路问题的Dijkstra算法, B, ^8 i# q$ [5 _7 h
%邻接矩阵(点与点的关系)
) j! F6 d) N7 E( G- ^2 Pw=[0,2,4,inf,inf,inf,inf;  
' ?2 ~! G6 m4 L   2,0,inf,3,3,1,inf;
0 O+ i& R) w* c* Y; z) o   4,inf,0,2,3,1,inf;                      ) P! Z, p4 G! M2 g! L
   inf,3,2,0,inf,inf,1;                    
9 \6 h: I* S& j/ I0 l& \   inf,3,3,inf,0,inf,3;
; w* J5 t: ], c6 r7 P   inf,1,1,inf,inf,0,4;7 }4 `; j( t, p1 F0 \
   inf,inf,inf,1,3,4,0];
* l4 b& Z& X/ c7 {2 y( F$ {4 g( Xn=size(w,1);%记录图中点数- V+ f! y: g1 M8 N4 }+ ]+ R( ?
( ~3 G) i6 v/ s2 w8 ]3 r) O
for i=1:n
5 |! x( a1 [$ U3 B/ e9 I1 P    l(i)=w(1,i); %为l(v)赋初值
2 u9 @, b* P0 ^0 Y    z(i)=1;      %为z(v)赋初值1
5 L: }" }& C# j* Q* w/ w0 eend
7 ]6 g9 u9 m7 e5 C
% e" ]6 K4 v6 \( Ms=[];            %s集合
; E: x# m" ?) q1 X0 K8 b8 j0 G* J6 P) Zs(1)=1;          %s集合的第1个元素为起点
9 Y* n# u7 A/ P; `4 Wu=s(1);
3 X& t* E3 |# t1 x: sk=1;             %k记录集合s中点的数量  `& n5 L/ m/ x3 d

8 `: ~: z" K7 |! l6 l/ Bwhile k<n       %当集合s未包含所有元素的时候执行循环
; n7 B2 ^% c: N! i    for i=1:n    %更新一遍l(v),z(v)4 i1 k. F4 w7 Z4 Z8 g7 ?
        if l(i)>l(u)+w(u,i)
9 Q* K) q# `6 }* e# y            l(i)=l(u)+w(u,i);
  p0 v( l6 l5 G: |0 b4 o            z(i)=u;+ M+ s' U3 F. k
        end( b! G. E" q$ B
    end
/ [0 E* ], Z( N0 X% @. a
0 x- t, x2 s3 i7 J/ r! j6 d; J    %找l(i)中最小的v加入s集合
) b1 {5 @5 o0 ~& h' s    ll=l;9 a- o% N4 `, v1 H
    for i=1:n
' }; G; ~; |0 L1 O        for j=1:k  _( @7 G& h% y
            if i==s(j)
& g% |& _/ z4 j; z/ \# N9 n+ q3 J                ll(i)=inf; %去除掉已经在s集合中的点
- u8 ]+ r- J5 ~' g2 [4 M8 e, l- R            end 5 p5 Y( S# {9 s2 S5 ~8 ^' |
        end
# Q$ E  k0 _. W0 f    end( q6 b3 D$ j- J1 B
    [lv,v]=min(ll); %求最小的l(v); b) L/ P" ~+ H8 F4 |0 k6 A
    s(k+1)=v;       %加入集合s
# T5 m& \; Y% x- o# }    u=v;
' \* f3 p9 r  `  j4 b7 I0 q    k=k+1;' n$ W7 i  {; H! j& c; m
end9 |2 D; m- V3 w7 [- |- a$ r: M' O$ x

# ~0 U% c5 d0 N; V5 gfprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
8 T$ x" t+ R5 m  q- L' ^( R9 b8 U1 N) ?- H
解释:! y5 v/ W1 l6 ?2 O$ G3 X8 f/ g: q

/ F8 M9 R8 n5 E5 U9 j2 ]- `' e0 T5 K1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。% R5 h4 _8 f. r1 F/ F4 G
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
' n# F1 u6 K) }+ i- t- p3 l; g9 O3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。( M/ T" ?1 R6 i9 q
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。( ]! r, H% d% }% c. U( d
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
2 M$ }* H# ?  s# c8 s* h9 X/ Y
注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
8 Q" x- X7 n4 u! `2 Z
" v/ g3 {2 V, c) q% b/ g" }7 i( `
9 @- k! d5 g3 E% w

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-8-5 09:07 , Processed in 0.462756 second(s), 55 queries .

回顶部