最短路径—Floyd算法
Floyd算法
所有顶点对之间的最短路径问题是:对于给定的有向网络G=(V,E),要对G中任意两个顶点v,w(v不等于w),找出v到w的最短路径。当然我们可以n次执行DIJKSTRA算法,用FLOYD则更为直接,两种方法的时间复杂度都是一样的。
1.定义概览
Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。
2.算法描述
1)算法思想原理:
Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)
从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。
2).算法描述:
a.从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
b.对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。
以下面的有向网络为例:
#include<stdio.h>
#define n 5 //结点数目
#define maxsize 160 //表示两点间不可达
int path[n][n];//路径矩阵
void floyd(int A[][n],int C[][n]); //A是路径长度矩阵,C是有向网络G的带权邻接矩阵
void main()
{
printf(" ——所有顶点对之间的最短路径:Floyd算法——\n");
printf("(160为无穷远,不可达)\n");
int A[n][n],C[n][n]={
{,,maxsize,,},
{maxsize,,,maxsize,maxsize},
{maxsize,maxsize,,maxsize,},
{maxsize,maxsize,,,},
{maxsize,maxsize,maxsize,maxsize,}
};
floyd(A,C);
}
void floyd(int A[][n],int C[][n]) //A是路径长度矩阵,C是有向网络G的带权邻接矩阵
{
int i,j,k,next;
int max=;
for(i=;i<n;i++)//设置A和path的初值
{
for(j=;j<n;j++)
{
if(C[i][j]!=max)
path[i][j]=j; //j是i的后继
else
path[i][j]=;
A[i][j]=C[i][j];
}
}
for(k=;k<n;k++)
//做n次迭代,每次均试图将顶点k扩充到当前求得的从i到j的最短路径Pij上
{
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(A[i][j]>(A[i][k]+A[k][j]))
{
A[i][j]=A[i][k]+A[k][j]; //修改长度
path[i][j]=path[i][k]; //修改路径
}
}
}
}
for(i=;i<n;i++)//输出所有顶点对i,j之间的最短路径Pij的长度及路径
{
for(j=;j<n;j++)
{
if(i!=j)
{
printf("%d到%d的最短距离为",i+,j+);
printf("%d\n",A[i][j]); //输出Pij的长度
next=path[i][j]; //next为起点i的后继顶点
printf("输出路径:\n");
if(next==)
printf("%d到%d不可达\n",i+,j+);
else//Pij存在
{
printf("%d",i+);
while(next!=j)
{
printf("——>%d",next+); //打印后继点
next=path[next][j]; //继续找下一个后继点
}
printf("——>%d\n",j+); //打印终点
}
printf("****************************************************\n");
}
}
}
} 运行结果:
——所有顶点对之间的最短路径:Floyd算法——
(160为无穷远,不可达)
1到2的最短距离为10
输出路径:
——>
****************************************************
1到3的最短距离为50
输出路径:
——>——>
****************************************************
1到4的最短距离为30
输出路径:
——>
****************************************************
1到5的最短距离为60
输出路径:
——>——>——>
****************************************************
2到1的最短距离为160
输出路径:
2到1不可达
****************************************************
2到3的最短距离为50
输出路径:
——>
****************************************************
2到4的最短距离为160
输出路径:
2到4不可达
****************************************************
2到5的最短距离为60
输出路径:
——>——>
****************************************************
3到1的最短距离为160
输出路径:
3到1不可达
****************************************************
3到2的最短距离为160
输出路径:
3到2不可达
****************************************************
3到4的最短距离为160
输出路径:
3到4不可达
****************************************************
3到5的最短距离为10
输出路径:
——>
****************************************************
4到1的最短距离为160
输出路径:
4到1不可达
****************************************************
4到2的最短距离为160
输出路径:
4到2不可达
****************************************************
4到3的最短距离为20
输出路径:
——>
****************************************************
4到5的最短距离为30
输出路径:
——>——>
****************************************************
5到1的最短距离为160
输出路径:
5到1不可达
****************************************************
5到2的最短距离为160
输出路径:
5到2不可达
****************************************************
5到3的最短距离为160
输出路径:
5到3不可达
****************************************************
5到4的最短距离为160
输出路径:
5到4不可达
****************************************************
参考:http://blog.sina.com.cn/s/blog_686d0fb001012r05.html
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
最短路径—Floyd算法的更多相关文章
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 7-8 哈利·波特的考试(25 分)(图的最短路径Floyd算法)
7-8 哈利·波特的考试(25 分) 哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变 ...
- 最短路径(Floyd)算法
#include <stdio.h>#include <stdlib.h>/* Floyd算法 */#define VNUM 5#define MV 65536int P[VN ...
- 单源最短路径——Floyd算法
正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3). Floyd算法的基本思想如下:从任意 ...
- 最短路径Floyd算法【图文详解】
Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- 图论之最短路径floyd算法
Floyd算法是图论中经典的多源最短路径算法,即求任意两点之间的最短路径. 它可采用动态规划思想,因为它满足最优子结构性质,即最短路径序列的子序列也是最短路径. 举例说明最优子结构性质,上图中1号到5 ...
- 最短路径——Floyd算法(含证明)
通过dij,ford,spfa等算法可以快速的得到单源点的最短路径,如果想要得到图中任意两点之间的最短路径,当然可以选择做n遍的dij或是ford,但还有一个思维量较小的选择,就是floyd算法. 多 ...
- 多源最短路径Floyd算法
多源最短路径是求图中任意两点间的最短路,采用动态规划算法,也称为Floyd算法.将顶点编号为0,1,2...n-1首先定义dis[i][j][k]为顶点 i 到 j 的最短路径,且这条路径只经过最大编 ...
随机推荐
- python selenium2 定位一组元素find_elements实例
打开hao123首页,需要定位以上区域中的所有链接,他们有相同的父元素<ul class="js_bd site-bd site-hd0">,所有链接处在li>a ...
- tomcat启动后过一会就自动关闭
1.打开tomcat 下的log查看关键字眼 常见问题就是端口被占用,被idea 页面启动占用了
- java多线程 -- ReadWriteLock 读写锁
写一条线程,读多条线程能够提升效率. 写写/读写 需要“互斥”;读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 writer,读取锁 ...
- 解题:USACO14MAR Counting Friends
题面 枚举每个数字是否能被删去,然后就是如何判定图是否存在.应该从按“度数”从大到小排序,从最大的顺次向其他点连边(先连“度数”小的可能会把一些可以和大“度数”点连接的点用掉).但是这个排序每连一次都 ...
- 团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树
L2-006. 树的遍历 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...
- UVALive 7505 Hungry Game of Ants (2015Ecfinal)
题意: 长度是n的线段上点的编号从1~n,每个点有一只蚂蚁蚂蚁的体重等于该点的编号,最初每只蚂蚁可以选择向右走或者向左走两只蚂蚁相遇时体重大的吃掉体重小的并且体重增加为两只的体重和,走到边界时掉头,问 ...
- 【Asp.net入门09】第一个ASP.NET 应用程序-处理窗体(1)
我们创建了一个HTML窗体,可以通过它显示受邀参加晚会的嘉宾,但是,当嘉宾单击Submit RSVP按钮时,同一个页面会反复多次显示.为了解决此问题,需要实现一段代码,用于在将窗体数据发布到服务器时执 ...
- 利用Snapshot快速跨Region迁移服务器
当你需要对现有的网站进行跨区域迁移,或者是部署DR Site的时候,又不希望重新部署应用,有什么好办法呢?其实你可以利用Azure的磁盘snapshot进行磁盘级的复制,这样可以减少很多部署应用的时间 ...
- 「Vue」程序式路由导航用法
1.button发起点击请求<mt-button type='primary' size='large' plain @click="topdcmt(id)">商品评论 ...
- solr基础使用概述
概述:solr 作为搜索引擎系统,它应该包含两部分内容,分别是:索引系统 和 搜索系统. 索引系统 它主要负责将外部不同数据源的数据转换为 solr 格式规范的数据格式(我们称之为:SolrInput ...