QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1188

主题

4

听众

2931

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
+ z. A4 o+ I% G7 O" P# a: D: xclear all
  g: d1 |5 y4 `* ~%图论最短路问题的Dijkstra算法
4 C. Z; N- q% p' [! a%邻接矩阵(点与点的关系)  {$ s6 J' B# L* M3 l
w=[0,2,4,inf,inf,inf,inf;  
) M' m9 m! Z3 ?   2,0,inf,3,3,1,inf;: o  r+ E! V- K, U+ p
   4,inf,0,2,3,1,inf;                     
- M  j5 u  R" O# n   inf,3,2,0,inf,inf,1;                    " \. {8 L: k8 _/ g  |, o
   inf,3,3,inf,0,inf,3;) W2 }# K1 J, ]) k0 d
   inf,1,1,inf,inf,0,4;1 E4 f( B' ^$ b& y
   inf,inf,inf,1,3,4,0];
! Z+ Y- y$ k  D2 P# {. k0 Bn=size(w,1);%记录图中点数
' f% M8 X6 ?) ]4 t2 a  ?! |; i1 E! G% k0 u9 r
for i=1:n
+ o' S% B& z$ ]" y    l(i)=w(1,i); %为l(v)赋初值
! M+ I! y' I" K: }4 e    z(i)=1;      %为z(v)赋初值19 B" ^: }7 P$ L* I% S. g
end2 u; b* L: U8 S2 m/ r& n

6 Y: J( `5 b1 J. Q; ls=[];            %s集合
' {2 n* }/ Z% ps(1)=1;          %s集合的第1个元素为起点9 |1 D  Q7 y8 i) O0 \
u=s(1);: d6 w2 x3 y+ e) `5 d9 ?# x
k=1;             %k记录集合s中点的数量
5 _  u  l2 o. r8 K4 I
3 `. s3 |8 H/ uwhile k<n       %当集合s未包含所有元素的时候执行循环5 @0 O+ }+ I0 n- q: V3 A3 {1 a! C" r
    for i=1:n    %更新一遍l(v),z(v)
+ M/ J7 c! P" Y7 B/ p        if l(i)>l(u)+w(u,i)
1 q, O# ~8 C0 ~2 X! G            l(i)=l(u)+w(u,i);9 O+ {. c+ p4 r* ^
            z(i)=u;
  F# m, k/ A: {2 o" Z. O        end0 N  H7 O' G. y- G) Q2 e3 G" x& ~( T
    end
' z! ^( X0 k  T4 s# g9 c5 f8 P8 b
% p+ N/ x4 r  D( T4 [# S. J    %找l(i)中最小的v加入s集合
7 V2 }, b& V$ a% E& |: F    ll=l;
8 k" X2 b1 N+ ^    for i=1:n
& \1 Z: P7 p+ R6 p: Y$ [        for j=1:k
$ l  o3 n0 Z$ t7 L/ ^            if i==s(j)
6 P/ p" F0 S3 @* e  ]4 G% U1 U/ a* ^                ll(i)=inf; %去除掉已经在s集合中的点: V) ?( q9 |& t  k& h* r
            end
- Q+ h% T* F, f3 I& q        end) l* l- W- }4 d
    end- ?: s2 C1 c& c8 I
    [lv,v]=min(ll); %求最小的l(v)
+ J$ Q7 l+ c2 ~5 G, Y* O    s(k+1)=v;       %加入集合s
9 k1 _1 q3 k6 R! r( h( b: l    u=v;
5 F4 n% n- @! ]5 o    k=k+1;
( O6 W+ V+ J, rend( W$ j# r: i3 {8 s
. r( J& M6 t$ Y; C
fprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)& u6 B- [9 r1 ?4 ~$ J

: p; f6 s* |5 L解释:
! D/ q8 L/ Q3 \0 |2 Z, K" `
6 c' W: ^' q, n9 C. Y% v# ?& }7 r1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。' J! n& u& Z: `$ r# T& U
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
" J! V$ E' X. B$ N3 E- V3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。
2 m+ n7 X* D0 X8 n4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。
2 Y! Z$ F' V' W( ^* ?5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。0 M  l" Z  ~3 M# b

! K) C4 B) ?6 |3 r. k& @8 Y注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
! c/ V2 T& I& \+ y" t2 b% ?
3 T3 }, |* K3 x( J3 `$ ?3 ]
3 n; F9 X4 x. M2 v( o6 p; A4 N

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-5-26 06:40 , Processed in 0.358906 second(s), 54 queries .

回顶部