核心思想:
用于解决单点到单点的最短路径问题。
每次找一个未被选过的 距离最短的点进行更新。
话不多说,直接看题。
如图,我们要解决V1到V11的最短路径问题。
我们先选中V1(因为是源点)
此时有V2 V3 V4三点与V1相连,其他不与V1相连的都看做是无穷。
即:
V1→V2 距离2
V1→V3 距离8
V1→V4 距离1
因此我们选中V4。
选中V4后,V4作为中间节点更新了V7
也就是
V1→V2 距离2
V1→V3 距离8
V1→V7 距离10
因此我们选中V2
此时 V2作为中间节点更新了V5
即:
V1→V5 距离3
V1→V3 距离8
V1→V7 距离10
因此我们选中V5
此时V5作为中间节点更新了V6 V8 V9
即:
V1→V8 距离5
V1→V3 距离8
V1→V6 距离6
V1→V7 距离10
V1→V9 距离12
因此我们选中V8
此时V8作为中间节点更新了V11
即:
V1→V3 距离8
V1→V6 距离6
V1→V7 距离10
V1→V9 距离12
V1→V11 距离14
因此我们选中V6
此时V6作为中间节点更新了V7
即:
V1→V7 距离9
V1→V9 距离12
因此我们选中V7
此时V7作为中间节点更新了V10
即:
V1→V10 距离10
V1→V9 距离12
因此我们选择V10
此时V10作为中间节点更新了V9 V11
即:
V1→V9 距离11
V1→V11 距离14
因此我们选择V9
此时V9作为中间节点更新了V11
即:
V1→V11 距离13
选中V11
问题解决!
即
V1→V11最短路径为13
顺序为1 2 5 6 3 7 10 9 11
用带权邻接矩阵可表示为
其中 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)