大家好,欢迎来到IT知识分享网。
弗洛伊德算法详解
说明
- 弗洛伊德算法也是求一个顶点到其他顶点的最短路径问题,和迪杰斯特拉算法有共同之处,不同处在于迪杰斯特拉算法只是求得某一具体的顶点到其他顶点的最短距离,而弗洛伊德会求出所有的顶点到其他顶点的距离,弗洛伊德会创建一个二维距离数组保存各个顶点到其它顶点的距离,通过不断的更新这个二维数组,获得最短的路径
- 弗洛伊德的核心思想为使用三层循环,第一层循环记录一个中间顶点,分别遍历所有的顶点,第二层循环记录一个开始顶点,分别遍历所有的顶点,第三层循环记录终点的顶点,分别遍历所有的顶点,每次遍历使用一个变量记录开始节点经过中间节点到终点节点的路径权值,如果这个路径小于开始节点到终点节点的直接路径权值,则更新开始到终点的路径为最短
- 弗洛伊德算法时间复杂度为立方阶,因为要遍历所有的情况,动态的更新数组,然后根据更新后的数组再判断距离的大小
- 弗洛伊德算法比较好理解,因为通过三层循环就能走通从当前节点到其他节点的所有路径,但是效率不是很高,对于节点数量较多的图不适用
- 源码见下
源码及分析
package algorithm.algorithm.floyd;
import java.util.Arrays;
/**
* @author AIMX_INFO
* @version 1.0
*/
public class FloydAlgorithm {
public static void main(String[] args) {
//顶点
char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
//邻接矩阵
int[][] matrix = new int[vertex.length][vertex.length];
final int N = 65535;
//权值
matrix[0] = new int[]{0, 5, 7, N, N, N, 2};
matrix[1] = new int[]{5, 0, N, 9, N, N, 3};
matrix[2] = new int[]{7, N, 0, N, 8, N, N};
matrix[3] = new int[]{N, 9, N, 0, N, 4, N};
matrix[4] = new int[]{N, N, 8, N, 0, 5, 4};
matrix[5] = new int[]{N, N, N, 4, 5, 0, 6};
matrix[6] = new int[]{2, 3, N, N, 4, 6, 0};
Graph graph = new Graph(vertex.length, vertex, matrix);
graph.floyd();
graph.show();
}
}
class Graph {
//顶点
private char[] vertex;
//各个顶点之间的距离
private int[][] dis;
//前驱顶点
private int[][] pre;
/**
* @param length 顶点个数
* @param vertex 顶点的值
* @param matrix 邻接矩阵
*/
public Graph(int length, char[] vertex, int[][] matrix) {
this.vertex = vertex;
this.dis = matrix;
this.pre = new int[length][length];
//前驱顶点默认为它自己
for (int i = 0; i < pre.length; i++) {
Arrays.fill(pre[i], i);
}
}
public void show() {
for (int k = 0; k < dis.length; k++) {
for (int i = 0; i < dis.length; i++) {
System.out.print(vertex[pre[k][i]] + "\t");
}
System.out.println();
for (int i = 0; i < dis.length; i++) {
System.out.print("("+vertex[k] + "-" + vertex[i] +":"+ dis[k][i] + ") ");
}
System.out.println();
System.out.println();
}
}
//弗洛伊德算法
public void floyd(){
int len = 0;
for (int k = 0; k < vertex.length; k++) {
for (int i = 0; i < vertex.length; i++) {
for (int j = 0; j < vertex.length ; j++) {
len = dis[i][k] + dis[k][j];
if (len < dis[i][j]){
dis[i][j] = len;
pre[i][j] = pre[k][j];
}
}
}
}
}
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/33201.html