QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:
9 q. W! ^- ?& G/ ]- |# }clear all
& O( J, Z/ z9 m%图论最短路问题的Dijkstra算法
% u  G; h) `4 [  s+ V9 s%邻接矩阵(点与点的关系)
1 ~) r8 A4 `2 Zw=[0,2,4,inf,inf,inf,inf;  
. ?+ w& x9 J0 K+ h  U& \   2,0,inf,3,3,1,inf;
* \6 _; \" w+ n! i4 b+ H9 o' f   4,inf,0,2,3,1,inf;                      , }2 F7 k7 ^0 e' B7 V4 X
   inf,3,2,0,inf,inf,1;                      i1 H% P4 G: f
   inf,3,3,inf,0,inf,3;
3 D7 _2 x* [% ]% A% c   inf,1,1,inf,inf,0,4;# m6 c, G( h- t* X- P
   inf,inf,inf,1,3,4,0];. a/ E% t4 P' Y. Q
n=size(w,1);%记录图中点数
# V. s: g! _4 _& [! G' ^6 X3 U3 i
/ _" i2 ]1 M4 D3 |/ c( i+ Y* cfor i=1:n) G5 h5 Q- V5 l& f# H# K
    l(i)=w(1,i); %为l(v)赋初值8 @( m! Z' e" c7 C
    z(i)=1;      %为z(v)赋初值1
! A% d; A- c* pend
& h1 @0 Z; Q0 l5 T+ W" c8 y) y. ^, S5 B1 \
s=[];            %s集合' _$ m8 B% B5 K; s) d- g: C" C
s(1)=1;          %s集合的第1个元素为起点& ~9 N7 a; O4 K% ^+ p# `
u=s(1);
1 o/ f0 g3 ]9 o3 [. Ak=1;             %k记录集合s中点的数量8 b& o* }2 h9 t0 J9 O: E( w7 R
7 O6 {& S4 I* i
while k<n       %当集合s未包含所有元素的时候执行循环9 o4 }+ e3 B% m7 d7 z& b) _* e- t" N
    for i=1:n    %更新一遍l(v),z(v)
8 {( w8 v! T+ G, M        if l(i)>l(u)+w(u,i)
* R8 {$ Y# o  G            l(i)=l(u)+w(u,i);! y: s. \; y& y, V/ f3 [- ?
            z(i)=u;
& t  `# s9 b; J! C3 v$ t        end$ t* Y) w$ b( P2 X& M8 E
    end: S  h/ P. \# f9 Z% h, L) ]

6 L" l6 A; m. _( a2 s) Q( s$ n    %找l(i)中最小的v加入s集合
9 p$ v5 f$ H7 Q4 E  K& U    ll=l;7 I' X* U" D2 x4 h* J
    for i=1:n
7 k- b# Y% P6 r5 q        for j=1:k! C- X5 `- U( w9 C2 y6 J
            if i==s(j)
8 \( ?% M, X  O" [' e/ D4 Y                ll(i)=inf; %去除掉已经在s集合中的点
6 q6 W6 G  g& ?$ m' f            end
+ ^; L0 w6 K# b" r        end
. k6 @7 B+ k3 M6 f# y; Z    end
4 ~# l) F$ q7 M& u    [lv,v]=min(ll); %求最小的l(v)% d# M" ^, S: G/ D& e
    s(k+1)=v;       %加入集合s
0 n- o; T% Y/ j3 W! e$ Q    u=v;
! S( }) Y+ e" i: U* I    k=k+1;
! r2 r! M* v  Z3 w2 Kend
" z7 F' g/ I. B! u+ M
$ \% B2 x3 O: U7 [- s! [) g; lfprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)* ?1 U: h* j3 H0 u- T0 W; n  _6 M

+ _4 k  k# j* X4 H  L/ X1 f3 l解释:
( U# [, H2 S* t2 T) H" k/ }
" m1 ^3 K" e* T4 S% Y1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
& s; F. H" X) m2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。' B6 l, @, L5 s6 x1 s# n
3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。2 b; G- ]  l+ O2 b
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。3 B9 r7 c; Y+ ^) M
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
/ N9 U4 s% b" u4 V9 _
' l4 E! X' ?* t' a5 c" z3 [注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。2 \! l& @: ?% V2 @4 j
+ L; W7 d. C" x
3 B" T2 V: m2 h) {$ |9 c% 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, 2026-6-16 19:41 , Processed in 0.403472 second(s), 55 queries .

回顶部