%最短距离
function [dist,path,Distance] = dijkstra(A,start,dest)
tic
% 初始化操作
p = size(A,1); %计算顶点数目
S(1) = dest; %初始化集合S,已加入到路径中的顶点编号
U = 1:p; %初始化集合U,未加入到路径中的顶点编号
U(dest) = []; %删除终点编号
Distance = zeros(2,p); %初始化所有顶点到终点dest的距离
Distance(1,:) = 1:p;
Distance(2,1:p) = A(dest,1:p);
new_Distance = Distance;
D= Distance; %初始化U中所有顶点到终点dest的距离
D(:,dest) = [];
path = zeros(2,p); %初始化路径
path(1,:) = 1:p;
path(2,Distance(2,:)~=inf) = dest; %距离值不为无穷大时,将两顶点相连
% 寻找最短路径
while ~isempty(U) %判断U中元素是否为空
index = find(D(2,:)==min(D(2,:)),1); %剩余顶点中距离最小值的索引
k = D(1,index); %发现剩余顶点中距离终点最近的顶点编号
%更新顶点
S = [S,k]; %将顶点k添加到S中
U(U==k) = []; %从U中删除顶点k
%计算距离
new_Distance(2,:) = A(k,1:p)+Distance(2,k); %计算先通过结点k,再从k到达终点的所有点距离值
D = min(Distance,new_Distance); %与原来的距离值比较,取最小值
%更新路径
path(2,D(2,:)~=Distance(2,:)) = k; %出现新的最小值,更改连接关系,连接到结点k上
%更新距离
Distance = D; %更新距离表为所有点到终点的最小值
D(:,S) = []; %删除已加入到S中的顶点
end
dist = Distance(2,start); %取出指定起点到终点的距离值
toc %计时结束
% 输出结果
fprintf('找到的最短路径为:');
while start = dest %到达终点时结束=inf) = dest; %距离值不为无穷大时,将两顶点相连
fprintf('%d-->',start); %打印当前点编号
next = path(2,start); %与当前点相连的下一顶点
start = next; %更新当前点
end
fprintf('%d\n',dest);
fprintf('最短路径对应的距离为:%d\n',dist);
end
%最短距离
function [dist,path,Distance] = dijkstra(A,start,dest)
tic
% 初始化操作
p = size(A,1); %计算顶点数目
S(1) = dest; %初始化集合S,已加入到路径中的顶点编号
U = 1:p; %初始化集合U,未加入到路径中的顶点编号
U(dest) = []; %删除终点编号
Distance = zeros(2,p); %初始化所有顶点到终点dest的距离
Distance(1,:) = 1:p;
Distance(2,1:p) = A(dest,1:p);
new_Distance = Distance;
D= Distance; %初始化U中所有顶点到终点dest的距离
D(:,dest) = [];
path = zeros(2,p); %初始化路径
path(1,:) = 1:p;
path(2,Distance(2,:)
% 寻找最短路径
while ~isempty(U) %判断U中元素是否为空
index = find(D(2,:)==min(D(2,:)),1); %剩余顶点中距离最小值的索引
k = D(1,index); %发现剩余顶点中距离终点最近的顶点编号
%更新顶点
S = [S,k]; %将顶点k添加到S中
U(U==k) = []; %从U中删除顶点k
%计算距离
new_Distance(2,:) = A(k,1:p)+Distance(2,k); %计算先通过结点k,再从k到达终点的所有点距离值
D = min(Distance,new_Distance); %与原来的距离值比较,取最小值
%更新路径
path(2,D(2,:)~=Distance(2,:)) = k; %出现新的最小值,更改连接关系,连接到结点k上
%更新距离
Distance = D; %更新距离表为所有点到终点的最小值
D(:,S) = []; %删除已加入到S中的顶点
end
dist = Distance(2,start); %取出指定起点到终点的距离值
toc %计时结束
% 输出结果
fprintf('找到的最短路径为:');
while start ~= dest %到达终点时结束
fprintf('%d-->',start); %打印当前点编号
next = path(2,start); %与当前点相连的下一顶点
start = next; %更新当前点
end
fprintf('%d\n',dest);
fprintf('最短路径对应的距离为:%d\n',dist);
end
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。