matlab中的dijkstra和floyd算法实现

dijkstra算法

变量意义

1、dist[]:记录从源点v0到其他各顶点当前的最短路径长度,它的初态为:若从v0到vi有弧,则dist[i]为弧上的权值;否则为无穷大。
2、path[]:从源点v0到其他各顶点的最短路径的前驱节点。
3、visited[]:从源点到当前节点是否已经确定是最短路径。
4、V:所有顶点集合。
5、S:已确定最短路径的顶点集合。

实现过程

1、初始化:集合S初始为{begin},dist[]的初始值为begin到其余所有顶点的边的权值。
2、从顶点V-S中选出从dist[]中的最小值的下标对应的节点Vi,并把该下标加入集合S中,这表示到Vi的最短路径已被确定为当前值。
3、修改从begin出发经过Vi到V-S中的所有顶点的最短路径长度:如果到Vi的最短路径长度加上邻接矩阵中Vi到Vj的路径长度小于begin到Vj的路径长度,则置dist[j]为那个更小值,并把i作为从begin到Vj的前驱节点path数组中。
4、重复执行2,3步骤,直到所有节点都加入S集合当中。

function [dist,path] = dijkstra( mgraph,begin )
%输入mgraph为邻接矩阵,begin为起点的标号
%输出dist和path为到其他所有点的最短路径向量和前驱节点向量
ifin = 99999999;
[row,col] = size(mgraph);
if row ~= col
    disp("行列维度不一致!");
    return;
end
dist = zeros(1,row);
path = zeros(1,row);
visited = zeros(1,row);
for i = 1:row
	visited(i) = false;
	dist(i) = mgraph(begin,i);
end
visited(begin) = true;
dist(begin) = 0;
%初始化完成,接下来是核心代码
for i = 1:row
	min = ifin;
	for j = 1:row
		if ~visited(j) && dist(j) < min
			v = j;
			min = dist(j);
        end
    end
	visited(v) = true;
	for k = 1:row
		if ~visited(k) && (min + mgraph(v,k) < dist(k))
			dist(k) = min + mgraph(v,k);
			path(k) = v;
        end
    end
end
end

floyd算法

实现过程

初始时,对于任意两个顶点vi和vj,若他们之间存在边,则以此边上的权值作为他们之间的最短路径长度。
若他们之间不存在有向边,则以无穷大作为他们之间最短路径长度。
以后逐步尝试在原路径中加入顶点k作为中间顶点
若增加中间顶点后,得到的路径比原来的路径长度减少了,则以此新路径代替原路径。

function [dist,path] = floyd( mgraph )
%输入mgraph为邻接矩阵
%输出dist和path最短路径矩阵和前驱节点矩阵
[row,col] = size(mgraph);
if row ~= col
    disp("行列维度不一致!");
    return;
end
dist = mgraph;
path = zeros(row);
%初始化完成,以下是核心代码
for k = 1:row
	for i = 1:row
		for j = 1:row
			if dist(i,k) + dist(k,j) < dist(i,j)
				dist(i,j) = dist(i,k) + dist(k,j);
				path(i,j) = k;
            end
        end
    end
end
end
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值