算法六:floyd-warshall和dijkstra

来源:互联网 发布:sms软件 编辑:程序博客网 时间:2024/05/21 19:45


Floyd-Warshall
求两点之间的最短路径
实际为“动态规划”的思想。
1、先只考虑通过1号顶点进行中转,求两点之间的最短路径,只需判断e[i][1]+e[1][j]<e[i][j],其中i为所有的点(1-n循环),j也一样。
2、接下来考虑1号和2号顶点中转,求两点之间的最短路径,只需判断e[i][2]+e[2][j]<e[i][j],其中i为所有的点(1-n循环),j也一样。
3、最后考虑经过1~n号所有顶点中转。
for(k=1;k<=n;k++)
{
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   if(e[i][j]>e[i][k]+e[k][j])
    e[i][j]=e[j][k]+e[k][j];
}
时间复制度为O(N^3)

Dijkstra算法-通过边实现松弛
是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。注意该算法要求图中不存在负权边。

2)算法步骤:时间复制度O((M+N)LogN)

a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。

例子:比如我们要求从1号顶点到其余各个顶点的最短路径:
1、二位数组e存储顶点之间边的关系,一位数组dis来存储1号顶点到其余各个顶点的初始路径。

2、先找一个离1号顶点最近的顶点(比如有a,b顶点),发现1-a的距离比较近,找到后就把“估计值”变成“确定值”。

3、定下a号顶点后,接下来再看a号顶点有哪些出边(比如有b,c顶点),再计算1通过a到b的距离,计算1到b的距离,看看那个小,如果小就把dis[b]更新为短的距离(松弛)。

4、再从b点出发,调到2,一直反复直把所有的“估计值”变成“确定值”,该确定值就是最短路径。

0 0
原创粉丝点击