最短路径之Floyd算法
Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm。
Floyd算法是一种在有权图中(有确定的非负的权值,不能存在环路)查找最短路径的算法。该算法的一次简单执行可以找出任意结点之间的最短路径(尽管它没有返回路径的具体信息)。
思想:
Floyd算法通过比较图中任意两点间所有可能存在的路径长度得到最短路径长度。
我们定义一个函数shortestPath(i,j,k)代表从结点i到结点j的最短路径且路径上所有结点的编号均小于k。
两结点间最短路径只有两种情况:1、从结点i经过若干编号小于k的结点到达结点j;2、从结点i经过若干编号小于k+1的结点到达结点j。
其中若最短路径为第二种情况,则此事路径可以分割为两段:从结点i到结点k+1和从结点k+1到结点j,其中从结点i到结点k+1为最短路径,从结点k+1到结点j也为最短路径。
我们定义w(i,j)为结点i到结点j的边的距离,如果两结点之间没有变则w(i,j)为无穷大。
那么以下等式
shortPath(i,j,0)=w(i,j);
shortestPath(i,j,k+1)=min(shortestPaht(i,j,k),shortestPaht(i,k+1,k)+shortestPath(k+1,j,k))
伪代码如下:
let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity)
for each vertex v
dist[v][v] ←
for each edge (u,v)
dist[u][v] ← w(u,v) // the weight of the edge (u,v)
for k from to |V|
for i from to |V|
for j from to |V|
if dist[i][j] > dist[i][k] + dist[k][j]
dist[i][j] ← dist[i][k] + dist[k][j]
end if
C代码
#include <stdio.h>
#define N 10//定义顶点个数
int arr[N][N];//定义二维数组,其初始值为该图的邻接矩阵
int main(){
int len;
while(scanf("%d",&len)!=EOF){
for(int i=;i<N;i++){
for(int j=;j<N;j++){
arr[i][j]=-;//初始化二维数组,因为floyd不存在负数权值,故我们使用-1代替无穷大
}
}
int i,j,c;//定义结点及权值
while(len--){
scanf("%d %d %d",&i,&j,&c);//输入边的两个结点及边的距离
arr[i][j]=arr[j][i]=c;
}
//
for(int k=;k<len;k++){
for(int i=;i<len;i++){
for(int j=;j<len;j++){
if(arr[i][k]==-||arr[k][j]==-)//如果两个之中有一个是无穷大,则必有arr[i][j]不能经过k结点联结
continue;
if(arr[i][j]==-||arr[i][k]+arr[k][j]<arr[i][j])//如果经过k结点后路径变短,则更新路径
arr[i][j]=arr[j][i]=arr[i][k]+arr[k][j];
}
}
}
} return ;
}
最短路径之Floyd算法的更多相关文章
- 数据结构与算法--最短路径之Floyd算法
数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...
- 最短路径问题——floyd算法
floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...
- 最短路径---Dijkstra/Floyd算法
1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...
- 26最短路径之Floyd算法
Floyd算法 思想:将n个顶点的图G“分成”很多子图 每对顶点vi和vj对应子图Gij(i=0,1,…,n-1和j=0,1,…,n-1) 每对顶点vi和vj都保留一条顶点限于子图Gij中的最短路径P ...
- 最短路径 - 弗洛伊德(Floyd)算法
为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是一个简单的3个顶点的连通网图. 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点 ...
- 最短路径问题-Floyd算法
概念 最短路径也是图的一个应用,即寻找图中某两个顶点的最短路径长度. 实际应用:例如确定某两个城市间的坐火车最短行车路线长度等. Floyd algorithm 中文名就是弗洛伊德算法. 算法思路:用 ...
- 图的最短路径---弗洛伊德(Floyd)算法浅析
算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...
- 每一对顶点间最短路径的Floyd算法
Floyd思想可用下式描述: A-1[i][j]=gm[i][j] A(k+1)[i][j]=min{Ak[i][j],Ak[i][k+1]+Ak[K+1][j]} -1<=k<=n ...
- 图结构练习——最短路径(floyd算法(弗洛伊德))
图结构练习——最短路径 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个带权无向图,求节点1到节点n的最短路径. 输 ...
随机推荐
- 使用border做三角形
网站上经常会使用一些三角形,除了图片的方式,实际上利用border我们可以做出纯CSS的三角形.我们知道border是个边抖可以单独设置,当四个边相交的时候他们是什么时候改变的? .t0{ margi ...
- 七天学会ASP.NET MVC(七)——创建单页应用
系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...
- HTTPS那些事(一)HTTPS原理(转载)
原创地址:http://www.guokr.com/post/114121/ 楔子 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行 ...
- Using assembly writing algorithm programs
This's my first version.The logic is simple, just the selection sort. I spent much time learning how ...
- windows命令——taskkill
C:\Users\Administrator>taskkill /? TASKKILL [/S system [/U username [/P [password]]]] { [/FI filt ...
- Maven日常 —— 你应该知道的一二三
以前在日常工作中,使用Maven只是机械的执行Maven clean.Maven install,对其中的原理与过程并无了解,近期阅读了<Maven实战>,对Maven有了更深入的理解. ...
- iOS----- Crash 分析(文二)-崩溃日志组成
iOS Crash 分析(文二)-崩溃日志组成 现在我们看一个淘宝iOS主客崩溃的例子: ### 1.进程信息 ### Incident Identifier: E4201F10-6F5F-40F9- ...
- L2 Population 原理 - 每天5分钟玩转 OpenStack(113)
前面我们学习了 VXLAN,今天讨论跟 VXLAN 紧密相关的 L2 Population. L2 Population 是用来提高 VXLAN 网络 Scalability 的. 通常我们说某个系统 ...
- javascript中函数声明和函数表达式浅析
记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方 ...
- iOS - 类扩展与分类的区别
类扩展 (Class Extension也有人称为匿名分类) 作用: 能为某个类附加额外的属性,成员变量,方法声明 一般的类扩展写到.m文件中 一般的私有属性写到类扩展 使用格式: @interfac ...