QQ登录

只需要一步,快速开始

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

图中最短路径解决方法 Dijkstra

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-12-22 11:02 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这段代码是Dijkstra算法的一个实现,用于在带权图中找到从一个起始点到其他所有点的最短路径。下面是对代码的逐步解释:0 c8 |& ?6 w- M- u0 Q7 [; I
clear all& P: P" v  R6 ~4 G
%图论最短路问题的Dijkstra算法; R7 [* C0 e: |0 `2 `( J9 \
%邻接矩阵(点与点的关系)
; P( }- ^' d6 A* q0 Mw=[0,2,4,inf,inf,inf,inf;  
. ]" |! I% n  v+ |, o   2,0,inf,3,3,1,inf;3 s+ c. y2 t6 `- {2 u
   4,inf,0,2,3,1,inf;                      ' z0 I$ `9 K7 t
   inf,3,2,0,inf,inf,1;                    
  {2 I* ~( u; w% h* u   inf,3,3,inf,0,inf,3;( }2 ^1 `# X- c+ R
   inf,1,1,inf,inf,0,4;5 u! |( ]$ ^  f8 I1 F' ?* u
   inf,inf,inf,1,3,4,0];
$ O8 J- ~  }) ~# Xn=size(w,1);%记录图中点数
4 l+ V& w  R) G" {# F2 `, O: \0 v
. S, {0 [2 r& H# n* |9 ofor i=1:n
5 u( |7 T& D" \" n    l(i)=w(1,i); %为l(v)赋初值* V8 O, `5 N- D0 |5 \6 K% S
    z(i)=1;      %为z(v)赋初值1
8 q1 b- Q' W( y6 u8 @end& D* Y( n6 Y: f

5 S9 \$ H& W4 Z, ], Ns=[];            %s集合& p' j  W3 D, o" h
s(1)=1;          %s集合的第1个元素为起点
- q8 C  i4 p/ D2 su=s(1);7 t! d' S1 u  l9 d3 r- \- n
k=1;             %k记录集合s中点的数量( Z$ M7 I5 Z, Z! p4 u

' Y  U  b  k( W  r2 i* g( [while k<n       %当集合s未包含所有元素的时候执行循环
+ J- |1 F7 z+ |; P    for i=1:n    %更新一遍l(v),z(v)
2 w5 _: K' {; A, H        if l(i)>l(u)+w(u,i). z; A& |4 `' M
            l(i)=l(u)+w(u,i);
! X1 |% n8 r' V  F( ?            z(i)=u;
) A) U6 `! D" _3 m' S" \        end
) O( E" Z0 x+ B" \3 A" d9 Y+ U0 b! g    end6 B( t2 _4 a' V5 Y/ }& y; J

" {7 h) l/ S9 n0 ^  d- p- U- p    %找l(i)中最小的v加入s集合5 f+ q8 S) |+ k
    ll=l;/ o% r! p4 i  E+ h) |+ R: g* _9 D
    for i=1:n
2 c6 }4 [/ l2 \        for j=1:k
/ @, U& Y) k# @% e* f# P1 A/ }" f            if i==s(j)  w% Q% Q! F. C& [  D0 `! |- x
                ll(i)=inf; %去除掉已经在s集合中的点
: ~0 A/ h1 H' C  M1 R3 V            end . Z* h* J* R/ n( V2 D
        end0 b2 M/ d* v$ g7 h: }
    end+ A; I0 E/ \7 E8 e7 z1 B& p
    [lv,v]=min(ll); %求最小的l(v)
1 l; N& B2 T/ S1 A$ v- S" k    s(k+1)=v;       %加入集合s) h3 I% V2 x, P. X
    u=v;, d2 B$ O* P; n7 @. M- w
    k=k+1;% v7 P+ T' ^0 z# D5 _( r
end) P: R/ r! R( u6 K) `) B

+ f! N* r4 Q' l: E' g3 A  m: g2 H( q( lfprintf('最短路为:%1d->%1d->%1d->%1d\n',z(z(z(7))),z(z(7)),z(7),7)
5 I* F  f5 f4 c0 L3 q/ M. R! H; ?+ W- W) s" k
解释:4 m( O" ~6 c% X4 D; f
# u& V+ P* C* L) j0 ?
1.清除变量: clear all 语句清除所有之前定义的变量,以确保从干净的状态开始执行程序。
9 `" z- A! \$ m5 x( x2.邻接矩阵: 图被表示为邻接矩阵 w,其中 w(i, j) 表示从顶点 i 到顶点 j 的边的权重。 inf 表示没有直接的边。
1 }( G8 `2 T+ @* @, F3 H3.初始化: l 数组存储从起始点到每个点的当前最短路径长度,z 数组存储路径中的前一个顶点。初始时,将起始点到每个点的距离初始化,并将前一个顶点初始化为起始点。$ y- i' i5 v0 N. f& V
4.主循环: 使用 while 循环,每次选择一个新的顶点加入集合 s,直到 s 包含所有顶点。在每次循环中,通过更新 l 和 z 数组来逐步找到最短路径。6 H) W# c  z+ u9 g& c
5.输出: 最后,使用 fprintf 打印从起始点到指定点的最短路径。在这里,路径是通过回溯 z 数组得到的。
7 {: ^3 q8 ?2 y  A9 z7 J. ?% \, H" V% m$ m
注意:这段代码的输出是针对特定的终点(顶点7)进行的,你可能需要根据你的需求更改这个值。
! G& E, x8 {2 \- l1 V9 P7 }1 j, ?# K$ d: N3 T6 b1 {3 ^; {

/ Y" A1 S+ Y( }6 r7 f8 `

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-12 11:03 , Processed in 0.629798 second(s), 55 queries .

回顶部