Floyd-Warshall (弗洛伊德算法)
问题描述:A准备去旅游,有些城市之间有公路,有些则没有,为了节省经费以及方便计划旅程,A希望找出任意两个城市之间的最短路程。
解析:有图可得有4个城市8条公路,并且都为单向的,现在需要一个数据结构来存储图的信息,可用一个4*4的矩阵来存储。
(图片解析:e[1][2]的值为2,就代表1号城市到2号城市的距离为2)
如果要让任意两点之间的距离变短,则要引入1,2,3......到n个点,下面将问题一般化。
当任意两点之间不允许经过第三个点时,这些城市之间的最短路程就是初始路程。(如下图)
假如现在只允许经过1号顶点,求任意两点之间的最短路径,则只需判断e[i][1]+a[1]
[j]是否比e[i][j]要小即可。代码实现:
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++){if(e[i][j]>e[i][1]+e[1][j])e[i][j]=e[i][1]+e[1][j];}
}
最短路线更新为:
现在继续求经过1号和2号两个顶点后的最短路径。(在只允许经过1号顶点时任意两点的最短路径的结果下 ,判断经过2号顶点是否可使其最短)代码如下:
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++){if(e[i][j]>e[i][2]+e[2][j])e[i][j]=e[i][2]+e[2][j];}
}
现在最短路径更新为:
综上,我们可以得到其核心代码:
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[i][k]+e[k][j];}}
}
这个算法的完整代码:
#include<stdio.h>
int main()
{int e[10][10],k,j,n,m,t1,t2,t3;int inf=99999999;scanf("%d %d",&n,&m);//初始化for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(i==j) e[i][j]=0;else e[i][j]=inf;}}//读入边for(i=1;i<=m;i++){scanf("%d %d %d",&t1,&t2,&t3);e[t1][t2]=t3;}//Floyd-Warshall算法核心语句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[i][k]+e[k][j];}}}//输出最终结果for(i=1;i<=n;i++){for(j=1;j<=n;j++){printf("%10d",e[i][j]);}printf("\n");}return 0;
}
(注释:如何表示正无穷。 通常定义为99999999,因为这两个数相加,其和仍然不超过int类型的范围(C语言中int类型可以存储的最大整数是2147483647)。
Floyd-Warshall (弗洛伊德算法)相关推荐
- 弗洛伊德算法_弗洛伊德算法
前面Dijkstra算法和Bellman-Ford算法解决了单源最短路径问题,但是如果需要获取图中任意两顶点的最短距离呢?我们可以使用前面两个算法我们可以遍历每个顶点得到每个顶点的单源最短距离,但是最 ...
- 弗洛伊德算法(Floyd)简介
弗洛伊德算法(Floyd)简介 Floyd算法适用于解决求最短路径问题,相比于Digkstra算法思路更加简单,更容易理解,但是效率会明显低很多,可以作为初步学习的一种方法. 目录 弗洛伊德算法(Fl ...
- C++floyd warshall算法求最短路径(附完整源码)
C++floyd warshall算法求最短路径 floyd warshall算法求最短路径的完整源码(定义,实现,main函数测试) floyd warshall算法求最短路径的完整源码(定义,实现 ...
- Floyd Warshall算法
Description: 描述: This is a very popular interview problem to find all pair shortest paths in any gra ...
- 弗洛伊德算法(floyd)
算法背景: 图中的A,B,C,D,E,F,G,代表7个村庄,边上的权值带表两村庄之间的距离,现在要从某一个村庄,例如G村庄,往另外几个村庄送邮件,问任意一村庄到其他各村庄的最短距离分别是多少? 思路: ...
- 图论应用 floyd(弗洛伊德)算法、dijkstra(迪杰斯特拉)算法
前言 图论应用是非常广泛的,不同于二叉树,二叉树是应用在数据存储结构提高查询效率的,而图论则是用在辅助决策系统中,求得最优化解的等等,而本篇文章中介绍的floyd(弗洛伊德)算法.dijkstra(迪 ...
- 最短路径之弗洛伊德算法(Floyd)——动态规划
弗洛伊德算法(Floyd)主要针对多源最短路径,且可以解决路径中有负权的情况(不包含负权回路),但是迪杰斯特拉算法只能解决正权值的单源最短路径(可以迭代多次求多源). 1.弗洛伊德算法的基本思想 弗洛 ...
- 最短路径三大算法——1,弗洛伊德算法floyd(复杂度O(n^3))
目前已经更新: 1,弗洛伊德算法floyd(复杂度O(n^3)) 2,迪杰斯特拉算法dijkstra (复杂度O(最坏n^2)) 3,SPFA算法(复杂度O(n*m)) 当然,最短路径有通用的bfs, ...
- 算法系列——弗洛伊德算法(Floyd)
本系列旨在用简单的人话讲解算法,尽可能避免晦涩的定义,读者可以短时间内理解算法原理及应用细节.我在努力! 本篇文章编程语言为Python,供参考. 弗洛伊德算法(Floyd) 典型最短路径算法.用于计 ...
- Floyd (弗洛伊德)算法简述
一.Floyd (弗洛伊德)算法简介 Floyd在1962年由Robert Floyd以其当前公认的形式出版.算法作为三个嵌套for循环的现代公式首先由Peter Ingerman在196 ...
最新文章
- c#中将HTML文件转换成PDF文件
- 【Windows Server 2019】文件共享,應該不支持 Everyone 訪問
- 高德地图定位5.0以下
- kafka----kafka connect的使用(一)
- openfire:openfire单独编译指定插件的方法
- 利用LM317的LED恒流源电路图
- 华为“不造车”的承诺,快到期了
- Android渐变背景色
- 数据仓库卸数(网银系统数据库)
- material-table的使用
- 深信服 华为路由器 ipsce对接
- 【Proteus仿真】按键设置+数码管显示
- 全新设计 水果忍者-穿靴子的猫官方中文版首发
- TCP网络调试助手上提示错误:“1035 未知错误”的有效解决方法,本人实测确实可行
- leetcode学习打卡--572. 另一个树的子树(递归,二叉树遍历)
- 浮动(Floats)原理与清除浮动
- 2.Lambda表达式
- pandas用read_scv读取含英文双引号的文件
- 什么是RPC?什么是Restful ?它们有什么区别?
- ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/docker-