不会吧?Floyd算法就这样吗?

不会吧?Floyd算法就这样吗?

Flod算法简介

Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。 虽然它不返回路径本身的细节,但是可以通过对算法的简单修改来重建路径。 该算法的版本也可用于查找关系R的传递闭包,或(与Schulze投票系统相关)在加权图中所有顶点对之间的最宽路径。
Floyd算法是用来计算图中,两点间的最短距离的(当然这两个点之间要是有通路的)。你大可以用Dijkstra算法来从头到尾都计算一遍,但显然当数据量很大时,这样麻烦且是行不通的,这时候我们就要采用到经典的Floyd算法了。

算法

在这里插入图片描述

题目与解题思路

题目:寻求该无向图中,各点间的最短路径。
在这里插入图片描述
首先说明,我们把A-F的6个顶点分别对应于数字1-6,建立他们的邻接矩阵A,其元素是aij,它的值就算直达边的权值,若没有则是无穷大。当然这是对应无向图的情况,有向图的邻接矩阵则是一个不对称方阵了,但是只要改一下数据即可,无伤大雅,哈哈哈。然后再定义一个记录经过顶点的6阶方阵P,最后我们就是通过这个A和P分别得出任意两顶点的最短路径长度和路径。

话不多说,看Matlab代码吧(其他语言实现起来也是大同小异的):

代码及结果

% Floyd算法
% 数据输入
A = [0 6 3 inf inf inf
     6 0 2 5 inf inf
     3 2 0 3 4 inf
     inf 5 3 0 2 3
     inf inf 4 2 0 5
     inf inf inf 3 5 0];
P = zeros(6);
for k = 1:6
    for i = 1:6
        for j = 1:6
            if A(i,k)~=inf && A(k,j)~=inf && A(i,k)+A(k,j)<A(i,j)
                A(i,j) = A(i,k)+A(k,j);
                P(i,j) = k;
            end
        end
    end
end

下面是经过操作后的A和P,读者可以根据两个图来得出最短路径和最短路径的长度。
在这里插入图片描述
在这里插入图片描述
大家有什么问题也可以在评论区留言,我们一起进步。觉得好的还可以点个赞哦。
笔者看了b站上算法的解说视频,觉得非常好,这里安利给大家。
https://www.bilibili.com/video/BV1w54y1Q79E?from=search&seid=11874714660448629143
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wlfyok/article/details/107740618