最短路径中的松弛技术

松弛(relaxation):指对于图 G = (V, E) 中 每个顶点v ∈ V,都设置一个属性dist[v],用来描述从源点s到v的最短路径上权值的上界.在开始进行一个最短路径算法时,只知道图中边和权值.随着算法的进行,逐渐得到各对顶点的最短路径的信息.算法会逐渐更新这些信息,每步都会检查是否可以找到一条路径比当前给定路径更短.这一过程通常称为松弛.

下面这两张图即为松弛操作.源点为点 S, 这里用 dist[i] 表示点 i 到源点 S 的最短路径,现对于边权为 60 的边 <u, v>进行松弛操作,如第一副图所示,现到顶点 v, u的最短路径分别为 100 和 30, 那么 dist[v] > dist[u] + W<u, v>, 所以对于 dist[v] 需要更新,则 S 到 v 的最短路径为 S 到 u 的最短路径经过<u, v>到 v.

如上所述,则 dist[v] = dist[u] + W<u, v>.写成伪代码:

1 Relax( u,  v,  W<u, v> ) {//W<u, v>代表边<u, v> 的权值
2     if ( dist[v] > dist[u] + W<u, v> ) {
3         dist[v] = dist[u] + W<u, v>;
4     }
5 }
时间: 2024-10-13 16:08:13

最短路径中的松弛技术的相关文章

学习dijk最短路径中

#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<time.h> using namespace std; int map[100][100]={0}; int book[100]={0}; int dis[100]={0};//顶点 int n=0,m=0; int minn=99999; int u=0; void Dijk()

最短路径之弗洛伊德算法(Floyd)

Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法. 路径矩阵 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵. 从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归的进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1): 又用同样地公式由D(1)构造出D(2):--:最后又用同样的公式由D(n-1)构造出矩阵D(n).矩阵D(n) 的 i 行 j 列元素便是 i 号顶点到 j 号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后

Dijkstra算法求单源最短路径

1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度. 最短路径在实际中有重要的应用价值.如用顶点表示城市,边表示两城市之间的道路,边上的权值表示两城市之间的距离.那么城市A到城市B连通的情况下,哪条路径距离最短呢,这样的问题可以归结为最短路径问题. 求最短路径常见的算法有Dijkstra算法和Floyd算法

最短路径算法总结

一.目的: 求源点到其他点之间的最短距离: 二.floyd算法: (1)     假设起点为A,终点为B,则A到B的距离要么是A直接到B,要么A经过其他节点到B,假设我们经过的节点为K,则最短路为min(dist[A][B],dist[A][K]+dist[K][B])每次更新即可: For (i=1;i<=n;i++) For (j=1;j<=n;j++) For(k=1;k<=n;k++) Dist[i][j]=min(dist[i][k]+dist[k][j],dist[i][j]

hiho一下 第二十四周---最短路径&#183;二:Floyd算法

最短路径·二:Floyd算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 由于没有肚子的压迫,小Hi和小Ho决定好好的逛一逛这个鬼屋,逛着逛着,小Hi产生了这样的问题:鬼屋中任意两个地点之间的最短路径是多少呢? 提示:其实如果你开心的话,完全可以从

POJ 2253 Frogger(Dijkstra变形——最短路径最小权值)

题目链接: http://poj.org/problem?id=2253 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but since the water is dirty and full of tourists' suns

蓝桥杯 单点最短路径问题

刚看到题目的时候马上就想到要用[邻接矩阵]存储边,并且用 Dijkstra算法求最短路径,但是提交代码后,检测结果是"运行错误",内存使用非常大. 再重新看一遍题目,发现数据规模中节点数目的平方远大于边的数目,所以用邻接矩阵存储是非常浪费内存的. 查找相关课本,图一般有四种存储方式: 1.邻接矩阵:形式简单,常用于节点数较少时,或者节点信息较少时,或是节点数的平方和边的数目较为相近时候.否在将耗费较大的空间资源. 2.邻接表:在边稀疏或当和边相关的信息较多时采用邻接表存储图将会比邻接矩

关于Floyd-Warshall算法由前趋矩阵计算出的最短路径反映出了算法的执行过程特性的证明

引言:Floyd-Warshall算法作为经典的动态规划算法,能够在O(n3)复杂度之内计算出所有点对之间的最短路径,且由于其常数较小,对于中等规模数据运行效率依然可观.算法共使用n此迭代,n为顶点个数.其中第k次迭代计算出每对顶点之间所有中间结点小于等于k的最短路径长度,其中i到j的最短路径要么是经过k的一条路径,这条路径的由k所分割出的两个路径i → k.k → j是中间路径小于等于k-1的最短路径:要么是从i到j的中间路径小于等于k-1的最短路径.定义dij(k)为从i到j的最短路径长度,

单源点最短路径的Dijkstra算法

在带权图(网)里,点A到点B所有路径中边的权值之和为最短的那一条路径,称为A,B两点之间的最短路径;并称路径上的第一个顶点为源点(Source),最后一个顶点为终点(Destination).在无权图中,最短路径则是两点之间经历的边数最少的路径.实际上,只要把无权图上的每条边都看成是权值为1的边,那么无权图和带权图的最短路径是一致的. 给定一个带权有向图G=(V,E),指定图G中的某一个顶点的V为源点,求出从V到其他各顶点之间的最短路径,这个问题称为单源点最短路径问题. 迪杰斯特拉(Dijkst