QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1183

主题

4

听众

2907

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
8 a  `! c3 m7 ~5 }6 Aclear all; H1 q- S3 R4 N- Z9 s
%图论最短路问题的Dijkstra算法0 c; @* L0 Z1 i) F1 z
%邻接矩阵(点与点的关系)
* D" E6 g3 c. I. iw=[0,2,4,inf,inf,inf,inf;  5 ^/ E# r8 [+ D5 [
   2,0,inf,3,3,1,inf;& v  g# q$ q- B) v6 G( b% m
   4,inf,0,2,3,1,inf;                      / T. b; C7 u% j5 i4 `( o# Q
   inf,3,2,0,inf,inf,1;                    ' V/ J0 o0 I2 A% m9 o
   inf,3,3,inf,0,inf,3;8 T' ?% ~4 ]/ S8 F, U1 U. d5 q
   inf,1,1,inf,inf,0,4;
6 t, a# \: m* a& P" y( J# M   inf,inf,inf,1,3,4,0];
; y( l% }, I% K: nn=size(w,1);%记录图中点数
5 J  ~/ q2 O  e( e9 u! x$ U( `, L: o- C3 }) }( j/ T2 n
for i=1:n
7 p8 K; u+ H' S# [3 Q    l(i)=w(1,i); %为l(v)赋初值
& }4 J* }8 y7 [( o' d1 M0 t4 \    z(i)=1;      %为z(v)赋初值1" P" Y. Q; v+ H- t  \
end
) J. B5 [5 }: M7 x; e- Z
; J3 V4 F$ R" ^- H/ a* E3 is=[];            %s集合
' h9 u" w  S: m# [* j% `s(1)=1;          %s集合的第1个元素为起点4 o! K* Z# a" J1 T6 Q+ a
u=s(1);! j3 n, M; H3 d
k=1;             %k记录集合s中点的数量
% N& F" @7 ]- h1 g2 ?! B. i5 r1 a) J7 Z
while k<n       %当集合s未包含所有元素的时候执行循环" ]+ F. i- Y' e9 }  ]  F/ [
    for i=1:n    %更新一遍l(v),z(v). |7 M' q9 N/ }; X  j3 w
        if l(i)>l(u)+w(u,i)
# N& B7 S+ G- {! e! {: i) D# g            l(i)=l(u)+w(u,i);% z6 n$ D: q" F4 Z7 e
            z(i)=u;* I- A  ^7 w; k* Z
        end/ ]5 f( [8 P# k8 w9 Q& [
    end
9 R: P" e% ?2 b% R" M6 K: w! i" A# T' P. \$ q% Y, r
    %找l(i)中最小的v加入s集合# ?# ~! f! u2 d" L
    ll=l;( ^' T, o4 U; q
    for i=1:n+ J. S! H# m$ j- M: E( o) A, ]; F
        for j=1:k
+ d4 U3 E+ @! m$ T            if i==s(j)* i1 ?) r3 I" L1 h3 \
                ll(i)=inf; %去除掉已经在s集合中的点
- O5 `8 F' X7 M* m5 E* @) |            end
$ ?. s( y; n7 V; I  S8 F- l        end$ s) k. y" U! S. l6 a9 Q5 r# H
    end, g1 b7 K- e& q* `; }. I  o
    [lv,v]=min(ll); %求最小的l(v)5 o6 J2 z/ ?& H  r" ?
    s(k+1)=v;       %加入集合s# i$ H+ f& r* W  \' m% }' j  ~& X7 F5 u
    u=v;
  |5 w/ D1 g; X9 k    k=k+1;  _% I& \/ _: n3 v2 H+ |
end
; ]9 o$ [9 c5 _% `
# }0 Q# u! d- B# rfprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
* j* X1 z5 a9 S2 ]8 n3 d
( [# `# c/ z  ?! E: d' j# J9 Q解释:, Y8 K; n9 O8 P4 j8 O1 X( ~; o

* u2 ^) o6 S& |. q, t, X3 }1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。( A5 X/ c8 u: p) X6 t, ]
2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
) `# T1 F, O) \/ p3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。
( \  M" Z: R  |# ?! k9 i5 A4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。
: T& c9 x: G% [- O5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。  a) k  C; j- G: P# S. V; s

+ n* ]! b( |3 V; ^* y5 }  v注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。" M# u- F  V: M# ^% f/ P) r

( _! s( o( }3 C# h; A5 _% H
, i0 j( N+ \# B( c

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-12-1 20:24 , Processed in 1.430410 second(s), 55 queries .

回顶部