算法六:floyd-warshall和dijkstra
2015-07-10 15:12
176 查看
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,一直反复直把所有的“估计值”变成“确定值”,该确定值就是最短路径。
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,一直反复直把所有的“估计值”变成“确定值”,该确定值就是最短路径。
相关文章推荐
- WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[WS标准篇]
- 常用日期格式符(表格)
- DWZ的选择带回功能无法带回第一个value中的值
- 关于spark ui中executor显示的内存量与设置的内存量不符的问题
- 模拟新浪微博随便看看
- Python函数式编程
- 内存区域划分
- MPI编译C++程序出现#error "SEEK_SET is #defined but must not be for the C++ binding of MPI" 的解决方法
- CF 340A The Wall
- 数据对齐
- C#流程控制语句
- C++学习网站总结[转]
- NYOJ5——Binary String Matching
- Android 开发新技术点评
- 悟空学Linux专栏----第19篇
- eclipse好用的快捷键
- 安装dlib python接口
- Hive去重复数据
- WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]