Floyd

floyd算法学习

浪子不回头ぞ 提交于 2020-12-18 09:52:33
1、问题引入   带权有向图中单源点的最短路径问题可以用地杰斯特拉算法求解,如果要求解图中每一对顶点之间的最短路径,类似可以想到的方法为:每次以一个顶点为源点,重复执行地杰斯特拉算法算法n次,这样,便可以求得每一对顶点之间的最短路径,总的执行时间为O(n 3 )。   这里可以采用另外一种求解算法:Floyd算法。 2、Floyd的基本思想为:    从邻接矩阵a开始进行n次迭代,第一次迭代后a[i,j]的值是从vi到vj且中间不经过变化大于1的顶点的最短路径长度;第k次迭代后a[i,j]的值是从vi到vj且中间不经过变化大于k的顶点的最短路径长度 第n次迭代后a[i,j]的值就是从vi到vj的最短路径长度。 3、算法描述:   (1) 用数组d[i][j]来记录i,j之间的最短距离。初始化d[i][j],若i=j则d[i][j]=0,     若i,j之间有边连接则d[i][j]的值为该边的权值,否则d[i][j]的值为max 。   (2) 对所有的k值从1到n,修正任意两点之间的最短距离,计算d[i][k]+d[k][j]的值,     若小于d[i][j],则d[i][j]= d[i][k]+d[k][j],否则d[i][j]的值不变。 4、具体实现:   带权有向图如下: 在b.txt文件中保存的带权有向图的数据为: 其中第一个数据4表述图中有4个节点

最短路径算法

陌路散爱 提交于 2019-12-09 18:09:23
单源最短路径问题 问题描述:给你一个顶点做源点,你想要知道,如何从源点到达其他所有点的最短路径。 OK,这个问题看起来没什么用。我们一般想知道的是A点到B点的最短路径,这个单源最短路径问题告诉我们A点到所有点的最短路径,会不会计算过多了呢? 有趣的是,解决A点到B点的最短路径算法不会比单源最短路径问题简单,我们所知的求A点到B点的最短路径算法就是求A点到任何点的最短路径。我们除了这样做,好像也没什么好办法了。 Dijkstra算法 基本原理: 每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图 不能有负权边 ,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。 适用条件与限制: 有向图 和 无向图 都可以使用本算法,无向图中的每条边可以看成相反的两条边。 用来求最短路的图中不能存在负权边。(可以利用拓扑排序检测) 算法流程: 在以下说明中,s为源,w[u,v]为点u和v之间的边的长度,结果保存在dist[] 初始化:源的距离dist[s]设为0,其他的点距离设为 正无穷大 ,同时把所有的点的状态设为没有扩展过。 循环n-1次: 在没有扩展过的点中取距离最小的点u