怎样用matlab编程实现Dijkstra算法
1个回答
展开全部
%单源点最短路径Dijkstra算法实现
function [d index1 index2] = Dijkf(a)
% a 表示图的权值矩阵
% d 表示所求最短路的权和
% index1 表示标号顶点顺序
% index2 表示标号顶点索引
%参数初始化
M= max(max(a));
pb(1:length(a))= 0; % 标记向量,表明是否已进入S集合
pb(1)= 1;
index1= 1;
index2= ones(1,length(a));
d(1:length(a))= M; % d矩阵所有元素都初始化为最大权值
d(1)= 0; % 以v1点为源点
temp= 1;
% 更新l(v),同时记录顶点顺序和顶点索引
while sum(pb)<length(a) % 重复步骤2,直到满足停止条件
tb= find(pb==0);
d(tb)= min(d(tb),d(temp)+a(temp,tb)); % 更新l(v)
tmpb= find(d(tb)==min(d(tb))); % 找出min(l(v))
temp= tb(tmpb(1));
pb(temp)= 1;
index1= [index1,temp]; % 记录标号顺序
index= index1(find(d(index1)==d(temp)-a(temp,index1)));
if length(index)>=2
index= index(1);
end % if结束
index2(temp)= index; % 记录标号索引
end % while结束
end
% Dijkf函数结束
function [d index1 index2] = Dijkf(a)
% a 表示图的权值矩阵
% d 表示所求最短路的权和
% index1 表示标号顶点顺序
% index2 表示标号顶点索引
%参数初始化
M= max(max(a));
pb(1:length(a))= 0; % 标记向量,表明是否已进入S集合
pb(1)= 1;
index1= 1;
index2= ones(1,length(a));
d(1:length(a))= M; % d矩阵所有元素都初始化为最大权值
d(1)= 0; % 以v1点为源点
temp= 1;
% 更新l(v),同时记录顶点顺序和顶点索引
while sum(pb)<length(a) % 重复步骤2,直到满足停止条件
tb= find(pb==0);
d(tb)= min(d(tb),d(temp)+a(temp,tb)); % 更新l(v)
tmpb= find(d(tb)==min(d(tb))); % 找出min(l(v))
temp= tb(tmpb(1));
pb(temp)= 1;
index1= [index1,temp]; % 记录标号顺序
index= index1(find(d(index1)==d(temp)-a(temp,index1)));
if length(index)>=2
index= index(1);
end % if结束
index2(temp)= index; % 记录标号索引
end % while结束
end
% Dijkf函数结束
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询