图论模型——Dijkstra算法

核心思想:

用于解决单点到单点的最短路径问题。

每次找一个未被选过的 距离最短的点进行更新。


话不多说,直接看题。

如图,我们要解决V1到V11的最短路径问题。

47f8787cabbb43e3a971c30899bebede.jpg

 我们先选中V1(因为是源点)

7bf76ee0ecd54f6b9f99fb8246a5ea82.jpg

 

此时有V2 V3 V4三点与V1相连,其他不与V1相连的都看做是无穷。

即:

V1→V2  距离2

V1→V3  距离8

V1→V4  距离1

因此我们选中V4。

6d907c6e8ea1412492b410d5148242b5.jpg

 

选中V4后,V4作为中间节点更新了V7

也就是

V1→V2  距离2

V1→V3  距离8

V1→V7  距离10

因此我们选中V2

38f9c971bd914211813c3181f353afb9.jpg

 此时 V2作为中间节点更新了V5

即:

V1→V5  距离3

V1→V3  距离8

V1→V7  距离10

因此我们选中V5

f5c494703cef4ca79fd7490d5c06b04d.jpg

此时V5作为中间节点更新了V6 V8 V9

即:

V1→V8  距离5

V1→V3  距离8

V1→V6  距离6

V1→V7  距离10

V1→V9  距离12

因此我们选中V8

0962d18a196841b4a283b8ab57f41764.jpg

 此时V8作为中间节点更新了V11

即:

V1→V3  距离8

V1→V6  距离6

V1→V7  距离10

V1→V9  距离12

V1→V11  距离14

因此我们选中V6

d36253b2b68c42e3a08405af0f47d1c5.jpg

 此时V6作为中间节点更新了V7

即:

V1→V7  距离9

V1→V9  距离12

因此我们选中V7

a5ae05cfb6bc41fcaa6a07baee03535f.jpg

 此时V7作为中间节点更新了V10

即:

V1→V10  距离10

V1→V9  距离12

因此我们选择V10

f9f39695f6554bf692b4d10c9cd2a86c.jpg

 

此时V10作为中间节点更新了V9 V11

即:

V1→V9  距离11

V1→V11  距离14

因此我们选择V9

827928ca08084cee826bcae32f598d55.jpg

 此时V9作为中间节点更新了V11

即:

V1→V11  距离13

选中V11

问题解决!

91480a65763149b2b4edec925128267f.jpg

 

V1→V11最短路径为13

顺序为1 2 5 6 3 7 10 9 11


用带权邻接矩阵可表示为

72b67e6c2b5e4b80988e3bee582688ec.jpg

其中 1-11行分别代表

V1-V11

1-11列也分别代表

V1-V11 

该矩阵在MATLAB中使用,进行求解。


附录

学习视频

【小石老师数学建模14讲(全)_数学建模比赛快速入门_13个常用数学模型-哔哩哔哩】 https://b23.tv/Wc9wox7

 

Dijkstra算法程序

tulun1.m
weight=    [0     2     8     1   Inf   Inf   Inf   Inf   Inf   Inf   Inf;
            2     0     6   Inf     1   Inf   Inf   Inf   Inf   Inf   Inf;
            8     6     0     7     5     1     2   Inf   Inf   Inf   Inf;
            1   Inf     7     0   Inf   Inf     9   Inf   Inf   Inf   Inf;
          Inf     1     5   Inf     0     3   Inf     2     9   Inf   Inf;
          Inf   Inf     1   Inf     3     0     4   Inf     6   Inf   Inf;
          Inf   Inf     2     9   Inf     4     0   Inf     3     1   Inf;
          Inf   Inf   Inf   Inf     2   Inf   Inf     0     7   Inf     9;
          Inf   Inf   Inf   Inf     9     6     3     7     0     1     2;
          Inf   Inf   Inf   Inf   Inf   Inf     1   Inf     1     0     4;
          Inf   Inf   Inf   Inf   Inf   Inf   Inf     9     2     4     0;];
[dis, path]=dijkstra(weight,1, 11)


dijkstra.m
function [min,path]=dijkstra(w,start,terminal)
n=size(w,1); label(start)=0; f(start)=start;
for i=1:n
   if i~=start
       label(i)=inf;
end, end
s(1)=start; u=start;
while length(s)<n
   for i=1:n
      ins=0;
      for j=1:length(s)
         if i==s(j)
ins=1;
         end,  
      end
      if ins==0
         v=i;
         if label(v)>(label(u)+w(u,v))
            label(v)=(label(u)+w(u,v)); 
         f(v)=u;
         end, 
      end, 
   end   
v1=0;
   k=inf;
   for i=1:n
         ins=0;
         for j=1:length(s)
            if i==s(j)
               ins=1;
            end, 
         end
         if ins==0
            v=i;
            if k>label(v)
               k=label(v);  v1=v;
            end,  
         end,  
   end
   s(length(s)+1)=v1;
u=v1;
end
min=label(terminal); path(1)=terminal;
i=1; 
while path(i)~=start
      path(i+1)=f(path(i));
      i=i+1 ;
end
path(i)=start;
L=length(path);
path=path(L:-1:1);

tip:

该算法是我第一次参加数学建模比赛时接触到的第一个算法,是它为我打开了通往数学建模的大门。同时也感谢@guguguyuan的耐心解答与指引!(虽然这个人非常喜欢装b)

 

 

  • 60
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值