QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:5 _6 ^% y% T2 g
clear all
! b1 m7 X  i6 v: x) Z# G9 v* Z1 f%图论最短路问题的Dijkstra算法
7 m1 e0 x7 E  i; `%邻接矩阵(点与点的关系)
6 I; }$ n5 n6 Q5 [0 v1 Qw=[0,2,4,inf,inf,inf,inf;  ! t. h5 Y' L5 f6 u( ^+ q
   2,0,inf,3,3,1,inf;
3 N+ d( G/ i- W& F4 u& X   4,inf,0,2,3,1,inf;                     
  y6 _, H( Q- C: n$ I) V6 F   inf,3,2,0,inf,inf,1;                    0 D6 f- t' [# d
   inf,3,3,inf,0,inf,3;
  d3 z) s( i8 c% _   inf,1,1,inf,inf,0,4;! ~, _9 D( t4 c9 a4 y" _, G
   inf,inf,inf,1,3,4,0];: V4 C* X2 Y% [4 V; b# i* {( ^
n=size(w,1);%记录图中点数
% k$ o4 r) B$ s$ O% V- H4 Y
- \# W, p: e0 X+ ^for i=1:n/ a& k  G: I# A1 t8 w4 V
    l(i)=w(1,i); %为l(v)赋初值4 D8 p: X2 x, V! l
    z(i)=1;      %为z(v)赋初值12 C% o) Z" q" u4 D
end
9 B2 H) \. F. U0 l$ U
% f$ o0 x5 r, ?, ?8 Os=[];            %s集合
( |! V6 N5 v7 L; v; [) Es(1)=1;          %s集合的第1个元素为起点
" `8 O& G$ L8 H4 Ju=s(1);
1 s. r$ M1 s$ H  K5 Q5 uk=1;             %k记录集合s中点的数量0 L/ a+ f# q9 r- M& y3 v

% R# Y4 t3 o1 I! [  u+ Y1 ]while k<n       %当集合s未包含所有元素的时候执行循环! o7 y+ l) w! G. x
    for i=1:n    %更新一遍l(v),z(v)2 c( |* u+ c# y5 q
        if l(i)>l(u)+w(u,i)1 m/ n% J( }- r" b4 `& r( j
            l(i)=l(u)+w(u,i);2 W4 x2 V" c1 G( ?- k8 K
            z(i)=u;
2 W# P- u7 ]" A6 [$ x- n# L) m        end# @1 l7 f6 _% g" |! f, }8 K
    end
8 Y6 f* C' v# N0 D1 \3 p; o3 Y( Q. c% k- C& q( ]& V
    %找l(i)中最小的v加入s集合
3 X1 u1 S3 k3 F, J9 B: V    ll=l;
/ d, ^) x# i- J# S( l    for i=1:n  N. f+ }) a! c
        for j=1:k
5 h+ `6 Y7 V2 f: I7 y- x            if i==s(j)
) I. }. J! r* p: L; A& z3 g* e                ll(i)=inf; %去除掉已经在s集合中的点
& w; g2 Z) f2 R            end " v# A2 ?  a; l' M8 i
        end
0 Z& N  O' ]6 W/ {& j4 t0 q; n    end' ]2 T2 n( O. r/ k
    [lv,v]=min(ll); %求最小的l(v)) z5 _9 x8 z! Y! T8 X
    s(k+1)=v;       %加入集合s
1 {2 d2 }7 b" k9 s/ x6 t    u=v;
& P, B& Z, r. X3 G! q- j( S    k=k+1;. e# ^- Y! C+ N  i$ ^
end- t5 q5 i( ^" o/ Z1 @! g, X

9 i, l0 @- A5 b+ p$ k. m/ Ufprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
! S2 E1 z0 E: ^) d# m# S. x5 i/ t; Z( K6 i: v# v
解释:
% X+ Y4 \# t0 ~: \) i. x2 y
) E, v% K2 t1 Z  L1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
  `- c# a' S  e/ X2 m% S2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
- u8 }' C  l, W2 K" E( T- @3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。# p. h; l1 J: u/ S! ~/ u
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。7 {% W# j/ \4 y5 l, l$ |
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
1 G' i! R2 T/ A/ u  |* ]
8 b1 H: d" j/ [# c! F  X注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。6 Y6 \! O4 z; G5 k

- z; p$ z3 o. n# y% ~* I0 b" g+ @/ ?5 V$ K0 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-4-10 17:06 , Processed in 0.977389 second(s), 55 queries .

回顶部