最短路算法详解(Dijkstra,Floyd)
最短路径
在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,把路径长度最短(即经过的边数最少)的那条路径叫作最短路径或者最短距离。
对于带权的图,考虑路径上各边的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或带权路径长度。从源点到终点可能不止一条路径,把带权路径长度最短的那条路径称为最短路径,其路径长度(权值之和)称为最短路径长度或最短距离。
最短路径算法
Dijkstra算法 该算法是用于求解单源点最短路径的实用算法
Dijkstra算法的基本思想如下:
设置并逐步扩充一个集合S,存放已求出其最短路径的顶点,则尚未确定最短路径的顶点集合是V-S其中,V为网中所有顶点集合。按最短路径长度递增的顺序逐个用V-S中的顶点加到S中,直到S中包含全部顶点,而V-S为空。
Dijkstra算法的具体步骤;
(1)设源点为V1,则S中只包含顶点V1,令W=V-S,则W中包含除V1外图中所有顶点。V1对应的距离值为0,即D[1]=0。W中顶点对应的距离值是这样规定的:若图中有弧 <v1,vk>,则Vj顶点的距离为此弧权值,否则 为一个无穷大的数;
(2)从W中选择一个其距离值最小的顶点 vk,并加入到S中;
(3)每往S中加入一个顶点vk后,就要对W中各个顶点的距离值进行一次修改。若加进vk做中间顶点,使<v1,vk> + <vk+vj>的值小于<v1,vj> 值,则用<v1,vk> + <vk+vj>代替原来vj 的距离值;
(4)重复步骤2和3,即在修改过的W中的选距离值最小的顶点加入到S中,并修改W中的各个顶点的距离值,如此进行下去,知道S中包含图中所有顶点为之,即S=V。这是D[N]就是从 v1到 vN的最短路径长度值。
Floyd算法 该算法能够求得任意顶点之间的最短路径。
Floyd算法的基本思想是:
任意2个顶点vi到vj的距离的带权邻接矩阵开始,每次插入一个顶点 vk,然后将 vi到 vj 间的已知最短路径与插入顶点 vk作为中间顶点时可能产生的 vi 到 vj 路径距离比较,取较小值以得到新的距离矩阵.如此循环迭代下去,依次构造出N个矩阵D1,D2,···Dn,当所有的顶点均作为任意 2个顶点vi 到 vj 中间顶点时得到的最后的带权邻接矩阵 Dn 就反映了所有顶点对之间的最短距离信息,成为图G的距离矩阵。
构造图G的距离矩阵:
设G是n个顶点的图,且其顶点用从1到n的整数编号。

算法应用
假定现有一公交网络如图3.1所示。假设该网络中任意一对有直接通路的顶点间的通路都是双向可行的,则可以将其抽象为一个无向带权图,并且各相邻顶点间的直接距离如表3.1所示,现要求解的问题是:寻找从A点出发到达其他各顶点的最短路径。根据Dijkstra算法,可得出搜索过程和结果如表3.2所示

图3.1 公交网络
从表3.2可以看出,从A点出发到达其它各顶点的最短路径,按递增顺序依次为A C(2km),A B(3km),A C D(4km),A C E(5km),A C D F(7km),A C E F G(11km)。
在实际应用中如果只是为了寻找两个指定顶点之间的最短路径,则可以给每个顶点赋予一个未访问标号(F)或已访问标号(T)。F表示从起始点到目的点之间还未找到最短路径,T表示从起始点到目的点之间已找到最短路径。这样每一次计算的目的是为了找到某个顶点将其F标号变成T标号,一旦目的顶点的标号变成T,则表示已寻找到从起始点到目的点之间的最短路径搜寻计算过程即可停止。例如,在上述实例中,如果只需求解从A点到达E点的最短路径,则搜寻会在A点、C点、B点、D点、E点的标号依次变成T之后结束,即 E点标号变成T后表示到达E点的最短路径已找到。
表3.1 无向图的边权列表

表3.2 最短路径算法的搜索过程和结果

Floyd算法执行过程:
例如对于以下的一个有向图,对应的临街矩阵的形式为:

邻接矩阵:

第一步:以定点0作为松弛的点,考虑a[i][j]表示定点i到顶点j经由顶点0的最短路径长度,经过比较,没有任何路径得到修改,因此有:

第二步:以定点1作为松弛的点,考虑a[i][j]表示定点i到顶点j经由顶点1的最短路径长度,经过比较,顶点0到顶点1由原来的没有路径变为0—1—2的路径,其长度为9;因此有:

第三步:以定点2作为松弛的点,考虑a[i][j]表示定点i到顶点j经由顶点2的最短路径长度,经过比较,顶点1到顶点0由原来的没有路径变为1—2—0的路径,其长度为7;
顶点3到顶点0由原来的没有路径变为3—2—0的路径,其长度为4
顶点3到顶点3由原来的没有路径变为3—2—1的路径,其长度为4因此有:

第四步:以定点3作为松弛的点,考虑a[i][j]表示定点i到顶点j经由顶点3的最短路径长度,经过比较,顶点0到顶点2由原来的路径长度为9,路径为 0—1—2,变为0—3—2,其长度为8;
顶点1到顶点0由原来的路径长度为7,路径为1—2—0,变为1—3—2—0,其长度为6;
顶点1到顶点2由原来的路径长度为4,路径为1—2 ,变为1—3—2 ,其长度为3;

如果设n为图中顶点的个数,则弗洛伊德的代码为:
void Floyd()
{
for(int k=0; k<n; k++)
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
if(Tu[i][j]>Tu[i][k]+Tu[k][j])
Tu[i][j]=Tu[i][k]+Tu[k][j];
}
}
具体讲解的应该是Dijkstra算法以及优化,看一个具体的题目
http://www.cnblogs.com/cmmdc/p/6772421.html
最短路算法详解(Dijkstra,Floyd)的更多相关文章
- 最短路算法详解(Dijkstra/SPFA/Floyd)
新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- [转] KMP算法详解
转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的K ...
- 【转】AC算法详解
原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...
- KMP算法详解(转自中学生OI写的。。ORZ!)
KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...
- EM算法详解
EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...
随机推荐
- Linux初步——常用简单命令
散乱的记录,目前是边学边用,以后有机会再整理 curl命令 发起一个HTTP请求,如:curl "http://www.baidu.com" 加上-I选项查看HTTP协议头的信息, ...
- Android Studio 使用小结
从去年(2013年5月)Google发布Android Studio 0.1.0版本,到如今已经一年多了,已经升级到0.8.6 Beta版 ,从刚开始大家报怨bug多,编译困难,到如今已经基本趋于稳定 ...
- 05-Mysql数据库----补充内容
数据库命名规则: 数据库命名规则: 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 不能使用关键字如 create select 不能单独使用数字 最长128位 # 基本上跟python或者 ...
- Oracle 11g 审计跟踪管理
在Oracle11g之前,oracle数据库自带的审计功能是关闭的,考虑到性能和审计管理的复杂性,用户一般不打开审计功能.如果有审计要求,DBA会采用trigger来实现对DDL审计的方法来折中.例如 ...
- C++中的默认参数规则
C++中的默认参数规则 C++的默认参数规则其实是一个非常容易掉坑的规则,尤其是当一个函数拥有多个声明的时候,每个声明的默认参数可以各不相同,在调用时又可能与每个声明都不同:这篇博客稍微列举一下C++ ...
- sqlserver查询数据库中有多少个表,多少视图,多少存储过程,或其他对象
sql server 数表: select count(1) from sysobjects where xtype='U' 数视图: select count(1) from sysobjects ...
- 树莓派配置 USB 无线网卡
树莓派配置 USB 无线网卡来上网的过程. 本人使用的USB无线网卡型号:EP-N8508GS(树莓派专用型号) 一.检查 USB 无线网卡是否已经正确识别 将无线 USB 网卡插入树莓派后启动树莓派 ...
- java多线程二之线程同步的三种方法
java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...
- 浅析Python中的main函数
Python作为一门较为灵活的解释型脚本语言,其中定义的main()函数只有当该Python脚本直接作为执行程序时才会执行: 当该python脚本被作为模块(module)引入(import)时,其中 ...
- C++中范围for语句
如果想对string对象中的每个字符做点什么操作,目前最好的办法是使用C++11新标准提供的一种语句:范围for(range for)语句. 示例代码: #include<iostream> ...