QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:. e  |  N6 E3 F/ F" {. R+ n
clear all
% G' v' c( X6 R# }# `: Q%图论最短路问题的Dijkstra算法0 `; Z6 N! o: c! U: }
%邻接矩阵(点与点的关系)
+ E5 Z2 i) v' x' jw=[0,2,4,inf,inf,inf,inf;  ' b5 [! M8 E" L5 z$ F' k: B
   2,0,inf,3,3,1,inf;% s' W3 T7 w  I3 S- r
   4,inf,0,2,3,1,inf;                     
3 M* @; s' S" d! t) B5 N: g5 }8 a   inf,3,2,0,inf,inf,1;                    
8 y. [& O  _% U3 N   inf,3,3,inf,0,inf,3;
' y, x7 F- B9 y' ?   inf,1,1,inf,inf,0,4;
9 |+ S, m0 Y, v0 e9 l' Y   inf,inf,inf,1,3,4,0];
$ B4 H- G; d' ^3 U1 S2 C- Un=size(w,1);%记录图中点数
! {) h- L9 ]- D  H/ m5 R, e8 E/ o$ ]
for i=1:n# h$ q# K4 y0 C
    l(i)=w(1,i); %为l(v)赋初值
, n$ \1 w$ i( A9 z" G$ `  X    z(i)=1;      %为z(v)赋初值1, ~: j% z4 B$ l, k5 N
end2 o/ b4 I2 C8 W' j
% F5 G- L# y9 L* D% a! n; E
s=[];            %s集合! r& T4 }4 I' A
s(1)=1;          %s集合的第1个元素为起点. U. Z- S2 {, ]* e, J
u=s(1);0 X0 ?& _1 E$ e& j% t' m7 v
k=1;             %k记录集合s中点的数量
+ M9 q: V$ |; e0 A- ^+ I- E2 X$ U( T9 A' G6 v% \5 n# l
while k<n       %当集合s未包含所有元素的时候执行循环
/ H) X0 v  Y/ f9 L3 ]    for i=1:n    %更新一遍l(v),z(v)+ X" K1 z/ I# S6 S
        if l(i)>l(u)+w(u,i)
7 p0 h/ M9 W2 y1 V1 H  D( R+ j$ P            l(i)=l(u)+w(u,i);
7 I2 j; U6 N5 C9 q* a7 Q            z(i)=u;! T$ b& e( A  k: X  k/ l
        end
4 S6 ~1 P6 @. T% o5 j) G  F    end
$ u: G( t8 g) _. Q, F: h# b. r1 O. c; b3 V
    %找l(i)中最小的v加入s集合- O+ l1 z& b0 [7 j
    ll=l;! o0 W- ]( x* |' d+ e7 J3 v
    for i=1:n
9 Z/ ^1 J- d* d+ u, P( ~        for j=1:k
2 Y; h6 ]% w8 @            if i==s(j)
. a6 ^) X: x' `& M$ w. b' a                ll(i)=inf; %去除掉已经在s集合中的点; E" o% l4 d. }* Q: ~
            end : L: q/ E% o+ R( B1 Z
        end
4 x0 @3 Z$ D7 O/ P/ T7 e: w    end) A  D: g  e' ~/ J/ Q4 D* r
    [lv,v]=min(ll); %求最小的l(v)
- I7 i; s- k4 f& z    s(k+1)=v;       %加入集合s
( t1 u* v9 x, m+ K0 C. i- M    u=v;
+ l$ m8 |0 |" r: S    k=k+1;" a6 D0 y" f5 s8 G! V  O
end
9 }. @1 V! _; w
: c/ }/ ]( n% g% h3 T+ f1 Mfprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7); o3 h5 m4 {1 S
, m$ K' n; _* ~6 I" W( {; J2 i
解释:
5 s! h2 L; Y& ?9 S" }1 I. V+ l5 q. u! S0 d, u8 n" ~
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
! [: B$ S" r) S; x. g+ F2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。7 O) e, T& q' W, B) S3 P( K
3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。! R* J2 l8 M1 L, ]+ R
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。
3 L6 v4 `$ J, x7 Y$ h: g5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。, b( }/ f3 Q( V9 g4 U

. U8 F! S0 |7 j! y! N: F1 ?注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。9 O/ `. a6 G2 O' Y
, B3 J$ V1 @: d/ d" T
! T+ N* T8 g9 ^% z

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 10:37 , Processed in 0.421719 second(s), 55 queries .

回顶部