弗洛伊德算法(floyd)
算法背景:
图中的A,B,C,D,E,F,G,代表7个村庄,边上的权值带表两村庄之间的距离,现在要从某一个村庄,例如G村庄,往另外几个村庄送邮件,问任意一村庄到其他各村庄的最短距离分别是多少?
思路:
该问题实际是求从任一顶点到其余顶点的最短距离,即多源顶点间的距离。可以用弗洛伊德算法求解。
floyd算法求最短距离:
算法思路:
当计算i到j之间的最短距离时,利用一个过渡顶点k,先求出i和k之间的距离,再加上k和j之间的距离,对比得出最短距离(动态规划思想)。图中任意两顶点间都通过过渡顶点计算。
floyd算法需要维护两个二维数组:(i和j均为顶点数组的索引)
- distance[i][j]: 保存第i个顶点和第j个顶点的最短距离。初始时为图的邻接数组值。
- prePath[i][j]: 保存第i个顶点到第j个顶点的前驱结点值。
核心代码:
算法分析:
floyd算法中有三层for,最外层为过渡结点,中间层为顶点,最内层为终点,算法复杂度为O(n³)。对稠密图求解最佳,运行一次便可得出所有顶点间的关系。
public void floyd() {for(int k = 0; k < n;k++) {//记录中间结点的索引for(int i = 0; i < n;i++) {//记录开始结点的索引for(int j = 0; j < n;j++) {//记录结束结点的索引int len = distance[i][k] + distance[k][j];//“过渡距离”if(len < distance[i][j]) {distance[i][j] = len;prePath[i][j] = prePath[k][j];}}}}
}
java代码:
import java.util.*;public class Floyd {public static void main(String[] args) {int INF = 0x3f3f3f3f;char []vertex = {'A','B','C','D','E','F','G'};int [][]edge = new int [][] {{INF,5,7,INF,INF,INF,2},{5,INF,INF,9,INF,INF,3},{7,INF,INF,INF,8,INF,INF},{INF,9,INF,INF,INF,4,INF},{INF,INF,8,INF,INF,5,4},{INF,INF,INF,4,5,INF,6},{2,3,INF,INF,4,6,INF}};graph graph = new graph(vertex, edge);graph.floyd();graph.printMatrix();graph.getAllPath();}
}class graph{char vertex[];int distance[][];int prePath[][];int n;//图中顶点的数量public graph(char[] vertex, int[][] distance) {this.vertex = vertex;this.distance = distance;n = vertex.length;prePath = new int[n][n];for(int i = 0; i < n;i++) {Arrays.fill(prePath[i], i);}}public void printMatrix() {System.out.println("各顶点间的最短距离为:");for(int i = 0; i < n;i++) {for(int j = 0; j < n; j++) {System.out.printf("(%c->%c:%d) ",vertex[i],vertex[j],distance[i][j]);}System.out.println();}}public void floyd() {for(int k = 0; k < n;k++) {//记录中间结点的索引for(int i = 0; i < n;i++) {//记录开始结点的索引for(int j = 0; j < n;j++) {//记录结束结点的索引int len = distance[i][k] + distance[k][j];//“过渡距离”if(len < distance[i][j]) {distance[i][j] = len;prePath[i][j] = prePath[k][j];}}}}}private void getPath(int start,int end) {//start为路径起点,end为终点int []temp = new int[n];int index = 0;int t = end;while(true) {if(t == start || start == t)break;temp[index++] = t;t = prePath[start][t];}temp[index] = start;System.out.printf("顶点%c到顶点%c的最短路径为:",vertex[start],vertex[end]);for(int i = index; i >= 0;i--) {System.out.printf("%c ",vertex[temp[i]]);}System.out.println();}public void getAllPath() {System.out.println("\n所有顶点间最短路径如下:");for(int i = 0; i < n;i++) {for(int j = 0; j < n;j++) {if(i == j)continue;getPath(i, j);}System.out.println();}}
}
运行输出:
各顶点间的最短距离为:
(A->A:4) (A->B:5) (A->C:7) (A->D:12) (A->E:6) (A->F:8) (A->G:2)
(B->A:5) (B->B:6) (B->C:12) (B->D:9) (B->E:7) (B->F:9) (B->G:3)
(C->A:7) (C->B:12) (C->C:14) (C->D:17) (C->E:8) (C->F:13) (C->G:9)
(D->A:12) (D->B:9) (D->C:17) (D->D:8) (D->E:9) (D->F:4) (D->G:10)
(E->A:6) (E->B:7) (E->C:8) (E->D:9) (E->E:8) (E->F:5) (E->G:4)
(F->A:8) (F->B:9) (F->C:13) (F->D:4) (F->E:5) (F->F:8) (F->G:6)
(G->A:2) (G->B:3) (G->C:9) (G->D:10) (G->E:4) (G->F:6) (G->G:4) 所有顶点间最短路径如下:
顶点A到顶点B的最短路径为:A B
顶点A到顶点C的最短路径为:A C
顶点A到顶点D的最短路径为:A G F D
顶点A到顶点E的最短路径为:A G E
顶点A到顶点F的最短路径为:A G F
顶点A到顶点G的最短路径为:A G 顶点B到顶点A的最短路径为:B A
顶点B到顶点C的最短路径为:B A C
顶点B到顶点D的最短路径为:B D
顶点B到顶点E的最短路径为:B G E
顶点B到顶点F的最短路径为:B G F
顶点B到顶点G的最短路径为:B G 顶点C到顶点A的最短路径为:C A
顶点C到顶点B的最短路径为:C A B
顶点C到顶点D的最短路径为:C E F D
顶点C到顶点E的最短路径为:C E
顶点C到顶点F的最短路径为:C E F
顶点C到顶点G的最短路径为:C A G 顶点D到顶点A的最短路径为:D F G A
顶点D到顶点B的最短路径为:D B
顶点D到顶点C的最短路径为:D F E C
顶点D到顶点E的最短路径为:D F E
顶点D到顶点F的最短路径为:D F
顶点D到顶点G的最短路径为:D F G 顶点E到顶点A的最短路径为:E G A
顶点E到顶点B的最短路径为:E G B
顶点E到顶点C的最短路径为:E C
顶点E到顶点D的最短路径为:E F D
顶点E到顶点F的最短路径为:E F
顶点E到顶点G的最短路径为:E G 顶点F到顶点A的最短路径为:F G A
顶点F到顶点B的最短路径为:F G B
顶点F到顶点C的最短路径为:F E C
顶点F到顶点D的最短路径为:F D
顶点F到顶点E的最短路径为:F E
顶点F到顶点G的最短路径为:F G 顶点G到顶点A的最短路径为:G A
顶点G到顶点B的最短路径为:G B
顶点G到顶点C的最短路径为:G A C
顶点G到顶点D的最短路径为:G F D
顶点G到顶点E的最短路径为:G E
顶点G到顶点F的最短路径为:G F
弗洛伊德算法(floyd)相关推荐
- 最短路径三大算法——1,弗洛伊德算法floyd(复杂度O(n^3))
目前已经更新: 1,弗洛伊德算法floyd(复杂度O(n^3)) 2,迪杰斯特拉算法dijkstra (复杂度O(最坏n^2)) 3,SPFA算法(复杂度O(n*m)) 当然,最短路径有通用的bfs, ...
- 最短路径算法——清晰简单的弗洛伊德算法(Floyd)
弗洛伊德算法(Floyd) \qquad 上一篇文章介绍了迪杰斯特拉算法(Dijkstra).具体请看:最短路径算法--简单明了的迪杰斯特拉算法(Dijkstra).Dijkstra适用于非负权图,并 ...
- 弗洛伊德算法Floyd
全知识整理目录 数据结构整理的目录包括了许多的数据结构相关知识. 目录 概述 算法过程 关键代码的实现 总结 参考 概述 Floyd算法是什么? Floyd算法也是动态规划的求最短路径,但不同于Dij ...
- 弗洛伊德(Floyd)算法之两点之间的最短距离问题
1.概述 (1)与迪杰斯特拉(Dijkstra)算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,该算法 名称以创始人之一.1978 年图灵奖获得者.斯坦福大学计 ...
- 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)
算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...
- 弗洛伊德算法_弗洛伊德算法
前面Dijkstra算法和Bellman-Ford算法解决了单源最短路径问题,但是如果需要获取图中任意两顶点的最短距离呢?我们可以使用前面两个算法我们可以遍历每个顶点得到每个顶点的单源最短距离,但是最 ...
- 【算法】弗洛伊德算法 最短路径算法
文章目录 1.概述 2.图解 2.1 图示 2.2 弗洛伊德算法的步骤: 3.代码 1.概述 弗洛伊德(Floyd)算法介绍 和Dijkstra算法一 样,弗洛伊德(Floyd)算法也是一种用 于寻找 ...
- 弗洛伊德算法学习(Java)
弗洛伊德算法学习(Java) 学习视频:尚硅谷韩老师java讲解数据结构和算法 一. 弗洛伊德(Floyd)算法介绍 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加 ...
- 弗洛伊德算法(Floyd)简介
弗洛伊德算法(Floyd)简介 Floyd算法适用于解决求最短路径问题,相比于Digkstra算法思路更加简单,更容易理解,但是效率会明显低很多,可以作为初步学习的一种方法. 目录 弗洛伊德算法(Fl ...
- 【算法】弗洛伊德(Floyd)算法
这个算法主要要弄懂三个循环的顺序关系. 弗洛伊德(Floyd)算法过程: 1.用D[v][w]记录每一对顶点的最短距离. 2.依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否 ...
最新文章
- 集合Gk表示这样一堆数字,该集合内的数字有k个1
- AIX系统卸载oracle
- 基环树一些有趣的事情
- vulnhub靶机获取不到ip
- 2014年度优秀员工代表发言稿
- pytorch报错RuntimeError: error in LoadLibraryA
- 基于 Raphael 的 Web UI 设计 - 初稿
- Android 仿360桌面小人
- WinDbg / SOS Cheat Sheet
- 解决SpringBoot集成Redis出现RedisConnectionException: Unable to connect to 192.168.64.100:6379
- cad高程点怎么抽稀_地形图缩编1:500变成2000,植被符号抽稀功能,
- java学习网络编程遇到异常java.net.SocketException:Software caused connection abort: socket write error
- 3D游戏编程作业10
- hadoop生态系统的详细介绍-详细一点
- Java8 通过foreach 遍历List,同时输出下标
- Web Workers详解
- 30 张图带你揭秘 CPU 是如何制造出来的!
- MATLAB激活了还需要激活
- python 文件操作 os模块和shutil模块
- 2012年度十大优秀免费云空间推荐